避免VBCSCompiler对Roslyn驱动的ASP.NET Razor MVC视图的影响?

时间:2016-10-11 11:44:30

标签: c# asp.net performance razor roslyn

为了在MVC5的Razor视图中支持C#6,我们通过web.config打开了Roslyn编译器平台:

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
    </compilers>
</system.codedom>

但是,在生产部署之后,每个视图/控制器似乎都有一个明显的“第一次加载”延迟,比没有启用此编译器时更糟糕。

重要的是,此延迟是您从部署的新站点获得的常规JIT延迟的补充。页面显然较慢,而VBCSCompiler.exe似乎在后台运行以“进一步编译”这些页面。

是否有预编译/优化此情况的最佳做法,以消除部署后的首次加载运行时延迟?理想情况下,VBCSCompiler.exe在部署发生后未运行,并在构建时执行。

我见过aspnet_compiler.exe的提及,并遇到了StackExchange.Precompilation(请参阅https://blog.stackoverflow.com/2015/07/announcing-stackexchange-precompilation/)并想知道这是否是正确的解决方法。

有没有人对这个特殊问题有任何经验?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用RoslynRazorViewEngine from StackExchange.Precompilation

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RoslynRazorViewEngine());

此视图引擎的主要目标,但 不能来摆脱启动性执行命中。有了它你就得到了C#6的支持。仍然必须在第一次加载时编译视图,但之后roslyn程序集最终在app域中,并且您获得更高的内存占用。由于在应用程序中调用了roslyn,因此您无需Web服务器上的特殊权限即可从.exe文件夹中执行另一个/bin。我们主要使用它来开发我们的开发机器。

我强烈建议您precompile all the views。这样您就不会获得启动性命中,并且您可以获得视图的编译时验证。您甚至可以在生成的视图代码上运行分析器。这就是StackOverflow目前在生产中运行的。

我在博文中提到了aspnet_compiler.exe,因为它是ASP.NET上预编译的原始工具(没有MVC)。不幸的是,它很慢。

答案 1 :(得分:0)

如果Roslyn编译器程序集不是NGen,则可能需要一些时间来启动VBCScompiler.exe(它引用了几个大型托管程序集,并且JIT它们需要时间)。要缩短JIT周期,您可以NGEN机器上的所有Rsolyn组件。您也可以从this blog找到一些帮助信息。