Назад | Перейти на главную страницу

Вызов powershell.exe выполняется очень медленно

У меня есть сервер 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 Вот.