首页 > 解决方案 > 为什么分号的执行时间比逗号长 500 倍?

问题描述

考虑以下 PowerShell 代码:

$sw = New-Object System.Diagnostics.Stopwatch
$sw.Start()
$sw.Elapsed.TotalMilliseconds;$sw.elapsed.TotalMilliseconds

输出:

32351.1651
32352.839

执行分号似乎需要 1 到 2 毫秒。

但是,当换成更小的逗号时,时间会显着下降:

$sw2 = New-Object System.Diagnostics.Stopwatch
$sw2.Start()
$sw2.Elapsed.TotalMilliseconds,$sw2.elapsed.TotalMilliseconds

输出:

21106.2669
21106.272

逗号可以在大约 6-8 微秒内运行;这就像快了两个数量级以上!

这是因为它的大小吗?还是敏捷?显然,作为一个较小的标点符号,逗号消耗的 RAM 较少,但这并不能解释如此巨大的差异。

有任何想法吗?

我的环境:Windows 7 Enterprise x64、PowerShell 6.2、3.4 GHz i7 CPU。

标签: powershell

解决方案


TheIncorrigible 是正确的,但我认为试图说明您的两个示例的结果表达式树可能有助于解释为什么第一个增量比下一个长得多。

这大致是PowerShell为第一种情况生成的表达式树(用分号分隔表达式;

                       Block ($a.b.c;$a.b.c)
                       /   \
          ____________/     \____________
          | pipeline |       | pipeline |
               /                   \
   ___________/________     ________\_________
  { expression: $a.b.c }   { expression: $a.b.c }

PowerShell 将这;两个表达式视为单独管道的起始元素并将其视为。因此,在评估第一个表达式并获得 的值之后$a.b.c,在运行时可以评估第二个表达式之前,它需要“包装”父管道,包括输出结果值。

然而,在第二种情况下,生成的表达式树看起来有点不同

                       Block ($a.b.c,$a.b.c)
                         |
                   ______|______
                   | pipeline  |
                         |
                   ______|______
                   |  array op |
   ________________|___     ___|________________
  { expression: $a.b.c }   { expression: $a.b.c }

在这里,作为二进制数组操作的一部分,两个表达式都被立即计算,由,- 换句话说,运行时在计算两个表达式之间不需要做任何其他事情,因此时间增量非常小的。

我希望这有助于阐明差异


显然,作为一个较小的标点符号,逗号消耗的 RAM 较少,但这并不能解释如此巨大的差异

这是无稽之谈

,并且;需要分配完全相同的内存量 - 2 个字节


推荐阅读