避免 VBCSCompiler 对 Roslyn 支持的 ASP.NET Razor MVC 视图造成性能影响?

2024-05-07

为了在 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/ https://blog.stackoverflow.com/2015/07/announcing-stackexchange-precompilation/)并想知道这是否是正确的解决方案。

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


您可以使用来自 StackExchange.Precompilation 的 RoslynRazorViewEngine https://github.com/StackExchange/StackExchange.Precompilation/blob/73c9a6b3deeb9f37e8f0300aa60a543dd5527825/Test.WebApp/Global.asax.cs#L32:

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

The 主要目标然而,这个视图引擎is not摆脱启动性能打击。有了它,您只需获得 C#6 支持。视图仍然必须在第一次加载时进行编译,但 roslyn 程序集随后会出现在应用程序域中,并且您会获得更高的内存占用。由于 roslyn 在应用程序中被调用,因此您不需要 Web 服务器上的特殊权限来执行另一个.exe来自/bin文件夹。我们主要用它来在我们的开发机器上进行开发。

我强烈推荐你预编译所有视图 https://github.com/StackExchange/StackExchange.Precompilation#replacing-aspnet_compilerexe-for-cshtml-precompilation。这样,您就不会受到启动性能影响,并且可以获得视图的编译时验证。您甚至可以对生成的视图代码运行分析器。这就是 StackOverflow 目前在生产环境中运行的内容。

我提到aspnet_compiler.exe在那篇博文中,因为它是 ASP.NET(无 MVC)上预编译的原始工具。不幸的是它非常慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免 VBCSCompiler 对 Roslyn 支持的 ASP.NET Razor MVC 视图造成性能影响? 的相关文章

随机推荐