PowerShell循环性能:为何将循环放入函数会更快?
为什么PowerShell中“函数内循环”比“直接脚本循环”更快?
先看测试代码:
$ranGen = New-Object System.Random $RepeatCount = 10000 'Basic for-loop = {0}ms' -f (Measure-Command -Expression { for ($i = 0; $i -lt $RepeatCount; $i++) { $Null = $ranGen.Next() } }).TotalMilliseconds 'Wrapped in a function = {0}ms' -f (Measure-Command -Expression { function Get-RandNum_Core { param ($ranGen) $ranGen.Next() } for ($i = 0; $i -lt $RepeatCount; $i++) { $Null = Get-RandNum_Core $ranGen } }).TotalMilliseconds 'For-loop in a function = {0}ms' -f (Measure-Command -Expression { function Get-RandNum_All { param ($ranGen) for ($i = 0; $i -lt $RepeatCount; $i++) { $Null = $ranGen.Next() } } Get-RandNum_All $ranGen }).TotalMilliseconds
测试输出示例:
Basic for-loop = 47.8668ms Wrapped in a function = 820.1396ms For-loop in a function = 23.3193ms
核心原因
这是因为PowerShell的脚本(全局)作用域和函数作用域执行机制存在差异:
- 在脚本/全局作用域中,每一行代码执行时都要做额外的运行时检查:比如变量的作用域查找、命令的动态解析,哪怕是
$ranGen.Next()这种简单调用,循环的每一次迭代都要重复这些流程,累积下来开销不小。 - 函数在定义时会被预编译成更高效的执行单元,内部代码路径被优化:变量查找直接指向函数参数或局部变量,方法调用的绑定也提前完成,循环过程中不需要重复做这些高开销的检查,整体执行效率自然提升。
第三种方式只多了一次函数调用的微小开销,但整个循环都在优化后的函数环境里运行,相比脚本作用域中每次循环都要做的冗余检查,总耗时反而更低。
内容的提问来源于stack exchange,提问作者Polshgiant
相关产品推荐
相关产品推荐

