代码之家  ›  专栏  ›  技术社区  ›  scobi

如何在4.0环境下加速PowerShell的启动?

  •  15
  • scobi  · 技术社区  · 15 年前

    我正在考虑在Perforce服务器上使用PowerShell脚本作为触发器。不幸的是,即使在我们的快速硬件上,启动PowerShell仍然需要2秒钟。现在,除非考虑到有200个用户不断地敲打服务器,否则这看起来不像是太长的时间,并且触发器可能(取决于条件)在运行时导致表锁定,从而拖延其他相关请求。

    我正在寻找减少PowerShell启动时间的方法。我在谷歌上找到的东西:

    • 缩小外形。 这是默认安装,没有配置文件自定义,没有pscx等,所以这没有帮助。
    • 在豪华的双星上运行ngen。 这是对v1问题的老建议。我们在第2版。
    • 保持温暖。 最初的启动速度很慢,但后来的启动速度很快。对我们也没有帮助。在服务器上,热启动时间为2秒,并通过频繁的请求保持热启动。
    • 不要将PowerShell用于此目的。 嗯,我希望避免那种“解决办法”…

    有人对缩短启动时间有其他建议吗?我不希望启动的速度像cmd.exe或.NET命令行应用程序一样快,但如果我能让它达到.5秒,我想我们会没事的。不可能的?

    更新 -原来这是4.0版。如果我添加一个配置文件,如中所述 another SO question 启动需要2秒钟。如果我把它设为默认值,那么启动时间就在四分之一秒以下。

    然后我想……也许这是一个4.0的GAC问题。所以我在 PowerShell Blog 但它说所有的程序集都已经是NGEN'D了。我确保它确实也在使用4.0 NGEN。

    所以我有两个选择:

    • 找出为什么4.0比3.5贵得多。
    • 切换到3.5框架,我不需要它,我需要性能。

    我很想解决第一个问题,但不知道从哪里开始。有人能帮忙吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   x0n    15 年前

    如果你坚持使用控制台主机powershell.exe,恐怕你会走运,除非你想通过在自定义控制台应用程序或Windows服务中托管一个runspace/runspacefactory来编写一个优化的脚本处理器,你自己动手吧。您可能会节省一秒钟的时间,但是.NET应用程序不太可能启动0.5秒,特别是在服务器内存不足的情况下。

        2
  •  21
  •   Zombo tliff    12 年前

    在豪华的双星上运行ngen。这是对v1问题的老建议。我们在第2版。

    我在v3下玩过这个,我发现一些图片 生成。

    当然,现在感觉创业速度要快得多。我会更清楚的 重新启动,因为第一次总是最糟糕的。要执行此操作的(我更新的)脚本 赢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
  •  2
  •   Jason R. Coombs    11 年前

    跟随一个很好的答案 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"