我一直想知道 PowerShell 中函数对性能的影响。假设我们想使用 System.Random 生成 100.000 个随机数。
$ranGen = New-Object System.Random
Run Code Online (Sandbox Code Playgroud)
执行
for ($i = 0; $i -lt 100000; $i++) {
$void = $ranGen.Next()
}
Run Code Online (Sandbox Code Playgroud)
在 0.19 秒内完成。我把调用放在一个函数中
Get-RandomNumber {
param( $ranGen )
$ranGen.Next()
}
Run Code Online (Sandbox Code Playgroud)
执行
for ($i = 0; $i -lt 100000; $i++) {
$void = Get-RandomNumber $ranGen
}
Run Code Online (Sandbox Code Playgroud)
大约需要 4 秒。
为什么会有如此巨大的性能影响?
有没有办法可以在使用函数的同时获得直接调用的性能?
PowerShell 中是否有更好(更高效)的代码封装方式?
函数调用是昂贵的。解决这个问题的方法是在函数中尽可能多地放入。看看下面的...
$ranGen = New-Object System.Random
$RepeatCount = 1e4
'Basic for loop = {0}' -f (Measure-Command -Expression {
for ($i = 0; $i -lt $RepeatCount; $i++) {
$Null = $ranGen.Next()
}
}).TotalMilliseconds
'Core in function = {0}' -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
'All in function = {0}' -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
Run Code Online (Sandbox Code Playgroud)
输出 ...
Basic for loop = 49.4918
Core in function = 701.5473
All in function = 19.5579
Run Code Online (Sandbox Code Playgroud)
从我模糊地回忆起[并且再也找不到],经过一定次数的重复后,函数脚本块被 JIT 化了……这似乎是速度的来源。
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |