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

sco*_*obi 15 powershell performance

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

我正在寻找减少Powershell启动时间的方法.我在Google上找到的东西:

  • 减少个人资料.这是默认安装,没有配置文件自定义,没有PSCX等,所以这没有帮助.
  • 在Posh二进制文件上运行NGEN.对于V1问题,这是一个老建议.我们在V2.
  • 保持温暖.初始的Posh启动很慢但后来的初创公司很快.对我们也没有帮助.在服务器上,热启动是2秒,并且经常请求保持温暖.
  • 不要将Powershell用于此目的.好吧,我希望避免那个"解决方案"......

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

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

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

所以我有两个选择:

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

我想先解决第一个但不知道从哪里开始.有人可以帮忙吗?

byt*_*ead 22

在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$_"}
}
Run Code Online (Sandbox Code Playgroud)


x0n*_*x0n 2

如果您坚持使用控制台主机 powershell.exe,恐怕您可能会运气不好,除非您想通过在自定义控制台应用程序(或 Windows 服务)中托管运行空间/运行空间工厂来编写优化的脚本处理器 - 您可以滚动你自己。您可能会节省一秒钟的时间,但 .NET 应用程序的 0.5 秒启动不太可能,特别是在服务器内存紧张的情况下。

  • 不支持吗?哦。嗯,Powershell 2 使用 v4 为我们运行,到目前为止我没有看到任何问题。只是启动延迟问题。SO 文章讨论了托管 Powershell 的 4.0 应用程序以及使用 4.0 程序集的 Powershell 本身。我可以尝试使用 .net 分析器来分析它,但我认为这不会给我任何可以采取行动的东西。出于好奇,无论如何都可以尝试一下。 (2认同)