У меня есть сервер Windows 2008 R2 с Powershell V4.0
У меня получился очень простой скрипт test.ps1 с таким содержанием:
Write-host "Hello world!"
Я вызываю этот сценарий из командной строки PowerShell следующим образом:
measure-command { powershell.exe -file .\test.ps1 }
Как видите, я получил чрезвычайно высокую ценность:
Days : 0
Hours : 0
Minutes : 0
Seconds : 7
Milliseconds : 992
Ticks : 79922815
TotalDays : 9,25032581018519E-05
TotalHours : 0,00222007819444444
TotalMinutes : 0,133204691666667
TotalSeconds : 7,9922815
TotalMilliseconds : 7992,2815
Или
Days : 0
Hours : 0
Minutes : 0
Seconds : 4
Milliseconds : 655
Ticks : 46556579
TotalDays : 5,38849293981481E-05
TotalHours : 0,00129323830555556
TotalMinutes : 0,0775942983333333
TotalSeconds : 4,6556579
TotalMilliseconds : 4655,6579
И это забирает мой процессор на 50%. Почему это слишком долго? Я пробовал с -noprofile
но это то же самое.
Спасибо за вашу помощь.
Powershell загружает, а JIT компилирует тонны, и тонны, и тонны материала. Это требует много чрезмерных циклов ЦП и дискового ввода-вывода.
Попробуйте использовать ngen.exe (генератор собственных изображений) для предварительной компиляции сборок, загружаемых Powershell во время запуска. Просто может улучшить время запуска.
$FrameworkDir=[Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
$NGENPath = Join-Path $FrameworkDir 'ngen.exe'
[AppDomain]::CurrentDomain.GetAssemblies() |
Select-Object -ExpandProperty Location |
ForEach-Object { & $NGENPath """$_""" }
Читать о ngen Вот.