如何在4.0环境中加速Powershell的启动?

时间:2010-11-17 20:08:39

标签: performance powershell

我正在考虑在Perforce服务器上使用Powershell脚本作为触发器。不幸的是,即使在我们的快速硬件上,Powershell启动仍需要2秒钟。现在,除非您考虑到200个用户不断地敲击服务器,并且触发器可能(取决于条件)在运行时导致表锁定,停止其他相关请求,这似乎不是很多时间。

我正在寻找减少Powershell启动时间的方法。我在Google上发现的事情:

  • 减少配置文件。这是默认安装,没有配置文件自定义,没有PSCX等,所以这没有帮助。
  • 在Posh二进制文件上运行NGEN。这是针对V1问题的旧建议。我们在V2。
  • 让它保持温暖。初始Posh启动速度很慢但后来的启动速度很快。对我们也没有帮助。在服务器上,热启动是2秒,并且经常请求保持温暖。
  • 不要为此目的使用Powershell。嗯,我希望避免使用“解决方案”......

有没有人有任何其他建议缩短启动时间?我不希望像cmd.exe或.NET命令行应用程序那样快速启动,但是如果我能得到这个.5秒,我想我们会没事的。不可能?

更新 - 事实证明这是一个4.0问题。如果我按照another SO question中的描述添加配置文件,则启动需要2秒。如果我将其保留为默认值,那么启动时间不到四分之一。

然后我想..也许这是4.0 GAC问题。所以我在PowerShell Blog上运行了脚本,但它说所有的程序集都已经完成了。我确信它确实也使用了4.0 ngen。

所以我有两个选择:

  • 弄清楚为什么4.0比3.5贵得多。
  • 切换到我不需要它的3.5框架,我确实需要性能。

我很乐意解决第一个但不知道从哪里开始。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:21)

  

在Posh二进制文件上运行NGEN。对于V1问题,这是一个老建议。我们在V2。

我在V3下一直在玩这个,我发现有些图像是 生成。

现在感觉启动现在要快得多。经过一段时间后,我会更清楚 重启,因为第一次总是最糟糕的。 (我的更新)脚本这样做 与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$_"}
}

答案 1 :(得分:2)

根据my question on 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"

答案 2 :(得分:1)

如果您坚持使用控制台主机powershell.exe,我担心您可能会运气不好,除非您想通过在自定义控制台应用程序中托管运行空间/运行空间来编写优化的脚本处理器 - 或者Windows服务 - 你自己滚动。您可能会刮掉第二个,但是不太可能为.NET应用程序启动0.5秒,特别是如果服务器内存不足。