Подтвердить что ты не робот

Как ускорить запуск Powershell в среде 4.0?

Я рассматриваю возможность использования сценариев Powershell для триггеров на нашем сервере Perforce. К сожалению, даже на нашем быстром оборудовании для запуска Powershell все еще требуется 2 секунды. Теперь это не похоже на много времени, если вы не считаете, что 200 пользователей постоянно забивают сервер, а триггер (в зависимости от условий) вызывает блокировку таблицы во время ее запуска, останавливая другие связанные запросы.

Я ищу способы сократить время запуска Powershell. Вещи, которые я нашел в Google:

  • Уменьшить профиль. Это установка по умолчанию, настройка профиля, отсутствие PSCX и т.д., Поэтому это не помогает.
  • Запустите NGEN в бинарных файлах Posh. Это старый совет по проблеме V1. Мы на V2.
  • Держите тепло. Первоначальный запуск Posh медленный, но более поздние стартапы бывают быстрыми. Также не полезно для нас. На сервере теплый старт составляет 2 секунды, и он постоянно нагревается частыми запросами.
  • Не используйте Powershell для этой цели. Ну, я надеюсь избежать этого "решения"...

Есть ли у кого-нибудь другие предложения по сокращению времени запуска? Я не ожидаю стартапа так быстро, как cmd.exe или .NET командной строки, но если я смогу получить это .5 секунд, я думаю, что все будет в порядке. Невозможно?

ОБНОВЛЕНИЕ. Оказывается, это проблема 4.0. Если я добавлю конфигурационный файл, как описано в другом вопросе SO, запуск займет 2 секунды. Если я оставлю его по умолчанию, то запуск будет за четверть секунды.

Тогда я подумал... возможно, это проблема 4.0 GAC. Поэтому я запустил script в блоге PowerShell, но он говорит, что все сборки уже ngen'd. Я убедился, что он действительно использует 4.0 ngen.

Итак, у меня осталось два варианта:

  • Выясните, почему 4.0 намного дороже 3.5.
  • Переключитесь на фреймворк 3.5, где он мне не нужен, и мне нужна производительность.

Я бы хотел решить первое, но не знаю с чего начать. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Я боюсь, что вам, вероятно, не повезло, если вы придерживаетесь консольного хоста powershell.exe, если только вам не хочется писать оптимизированный процессор script, разместив в рабочей области приложение runpace/workspacefactory, или служба windows - вы сами катитесь. Вы можете избавиться от второго, но запуск 0.5s для приложения .NET маловероятен, особенно если серверы жесткие для памяти.

Ответ 2

Запустите NGEN в бинарных файлах Posh. Это старый совет по проблеме V1. Мы на V2.

Я играл с этим под V3, и я узнал, что некоторые изображения были генерируется.

И это, безусловно, похоже, что запуск намного быстрее. Я буду знать лучше после перезагрузка, так как в первый раз всегда самое худшее. (Мой обновленный) script, чтобы сделать это с Win 7

$env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  if (! $_.location) {continue}
  $Name = Split-Path $_.location -leaf
  Write-Host -ForegroundColor Yellow "NGENing : $Name"
  ngen install $_.location | % {"`t$_"}
}

Ответ 3

После отличного ответа на мой вопрос о Technet, я обнаружил гораздо более простой способ запуска NGEN вручную (поскольку, похоже, он не происходят автоматически при чистой установке Windows 8.1):

schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319"
schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64"