【问题标题】:Invoke-Command faster than the command itself?Invoke-Command 比命令本身更快?
【发布时间】:2017-02-09 13:41:43
【问题描述】:

我试图测量一些在 PowerShell 中写入文件的方法。毫无疑问,但我不明白为什么下面的第一个 Measure-Command 语句比第二个语句需要更长的时间来执行。

它们是相同的,但在第二个中我编写了一个脚本块发送到Invoke-Command,在第一个中我只运行命令。

我能找到的关于Invoke-Command速度的所有信息都是关于远程处理的。

这个块大约需要 4 秒:

Measure-Command {
    $stream = [System.IO.StreamWriter] "$PSScriptRoot\t.txt"
    $i = 0
    while ($i -le 1000000) {
        $stream.WriteLine("This is the line number: $i")
        $i++
    }
    $stream.Close() 
} # takes 4 sec

下面这段代码完全相同,但写在传递给Invoke-Command的脚本块中大约需要1秒:

Measure-Command {
    $cmdtest = {
        $stream = [System.IO.StreamWriter] "$PSScriptRoot\t2.txt"
        $i = 0
        while ($i -le 1000000) {
            $stream.WriteLine("This is the line number: $i")
            $i++
        }
        $stream.Close()
     }
     Invoke-Command -ScriptBlock $cmdtest
} # Takes 1 second

这怎么可能?

【问题讨论】:

  • 在这种特殊情况下可能是因为 icm doesn't create a steppable pipeline。无论如何,这是一个很棒的发现!
  • 本,@wOxxOm:哎呀!我的回答最初的框架并不完全正确——这个问题与可步进的管道无关。这只是关于点源与在子范围内运行 - 请参阅我的更新。
  • 确实,我什至偶尔会在繁重的函数中使用重新分配给同名变量以使其成为本地变量。

标签: powershell-4.0 invoke-command


【解决方案1】:

事实证明,根据 PowerShell 团队成员在 this related GitHub issue 上的反馈,问题更普遍地与 (隐式)点源(例如直接调用表达式)与在子范围内运行,例如使用&,调用运算符,或者在手头的情况下使用@987654323 @。

在子作用域中运行避免了在(隐式)点源时执行的变量查找。

因此,从 Windows PowerShell v5.1 / PowerShell Core 6.2 开始,您可以通过简单地通过 & { ... } 调用表达式来加速 无副作用 表达式,在子作用域中(有点违反直觉,因为创建新作用域涉及额外工作):

也就是说,这种优化可以用于不希望(直接)修改调用者变量的表达式。

以下简化代码使用foreach 表达式循环一百万次 (1e6) 证明了这一点:

# REGULAR, direct invocation of an expression (a `foreach` statement in this case), 
# which is implicitly DOT-SOURCED
(Measure-Command { $result = foreach ($n in 1..1e6) { $n } }).TotalSeconds

# OPTIMIZED invocation in CHILD SCOPE, using & { ... }
# 10+ TIMES FASTER.
(Measure-Command { $result = & { foreach ($n in 1..1e6) { $n } } }).TotalSeconds

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多