powershell - 为什么分号的执行时间比逗号长 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。
解决方案
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 个字节
推荐阅读
- ruby - Ruby 在 Ubuntu 中无法识别
- ios - iOS:全局检测键盘输入
- reactjs - 在编辑输入中加载嵌套资源属性值
- amazon-web-services - 替代在本地安装 Docker(Win 10 Home)以进行 AWS 无服务器开发
- google-apps-script - 电子表格中的当前值过滤器?
- symfony - Symfony 3. 无法使用 Doctrine 删除元素。“父行:外键约束失败”
- flutter - 如何在颤动中单击按钮添加字段
- ubuntu - 在 ubuntu 18.04 LTS 上安装 Oracle jdk 11
- python - 检索和修改 XGBoost 权重
- c# - 支持嵌套对象的生成器