Функции и производительность PowerShell - PullRequest
0 голосов
/ 30 января 2019

Меня интересует влияние на производительность функций в PowerShell.Допустим, мы хотим сгенерировать 100.000 случайных чисел, используя System.Random.

$ranGen = New-Object System.Random

Выполнение

for ($i = 0; $i -lt 100000; $i++) {
    $void = $ranGen.Next()
}

завершается в течение 0,19 секунды.Я помещаю вызов в функцию

Get-RandomNumber {
    param( $ranGen )

    $ranGen.Next()
}

Выполнение

for ($i = 0; $i -lt 100000; $i++) {
    $void = Get-RandomNumber $ranGen
}

занимает около 4 секунд.

Почему такое огромное влияние на производительность?

Есть ли способ, которым я могу использовать функции и при этом получать производительность, которая у меня есть при прямом вызове?

Существуют ли лучшие (более производительные) способы инкапсуляции кода в PowerShell?

1 Ответ

0 голосов
/ 30 января 2019

вызов функции дорогой .Способ обойти это - положить как можно больше в функцию.взгляните на следующее ...

$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

вывод ...

Basic for loop = 49.4918
Core in function = 701.5473
All in function = 19.5579

из того, что я смутно вспоминаю [и не могу найти снова], после определенного количестваповторяется, скриптовый блок function получает JIT-ed ... это, кажется, отсюда и скорость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...