PowerShell 功能和性能

Ben*_*Ben 3 powershell

我一直想知道 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 中是否有更好(更高效)的代码封装方式?

Lee*_*ley 5

函数调用是昂贵的。解决这个问题的方法是在函数中尽可能多地放入。看看下面的...

$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 化了……这似乎是速度的来源。

  • 16次,根据此:/sf/ask/2394172371/ (2认同)
  • @JanneTuukkanen - _谢谢_!这正是我正在寻找的信息...... [*grin*] (2认同)