繁体   English   中英

为什么aspnet_compiler.exe这么慢(可以更快)?

[英]Why is aspnet_compiler.exe so slow (and can it be made any faster)?

在我们的构建过程中,我们对我们的网站运行aspnet_compiler.exe ,以确保ASP.NET / MVC中所有后期绑定的内容实际构建(我对ASP.NET一无所知但我确信这是必要的,以防止在运行)。

我们的网站规模相当大,有几百页/视图/控件/等。 然而,在10-15分钟范围内所花费的时间似乎过多(作为参考,这比整个解决方案需要大约40个项目的编译时间更长,我们只是预编译了两个网站项目)。

我怀疑硬件是问题,因为我运行的是最新的四核英特尔芯片,配备4GB内存和WD Velociraptor 10,000rpm硬盘。 而奇怪的部分是EXE似乎没有使用太多的CPU(1-5%)并且似乎也没有做太多的I / O.

那么......这是一个众所周知的问题吗? 为什么这么慢? 有没有办法加快速度?

注意:为了澄清人们已经回答的一些事情,我不是在谈论Visual Studio中的代码编译。 我们已经在使用Web应用程序项目了,编译速度不是问题。 问题是在已经编译这些项目之后预先编译网站( 有关详细信息,请参阅此MSDN页面 )作为开发构建脚本的一部分。 我们正在执行就地预编译,而不是将文件复制到目标目录。

切换到Roslyn编译器最有可能显着改善预编译时间。 这是一篇很好的文章: http//blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications。 aspx

除此之外,还要确保通过在编译元素上将批处理属性设置为true来启用批处理编译。

简单地说,每当aspnet_compiler开始预编译任何单独的aspx页面时, aspnet_compiler使用“全局编译器锁”。 它基本上只允许按顺序编译每个页面。

这是有原因的(虽然我个人不同意) - 主要是为了检测和防止导致无限循环排序的循环引用,以及确保在编译需求页​​面之前正确构建所有依赖项,它们避免很多“令人讨厌的CS问题”。

上次我在一家网络公司工作时,我曾经开始编写一个大量分叉的aspnet_compiler.exe版本,但却被“真正的工作”所束缚,从未完成它。 最大的问题是ASPX页面:你可以将HELL并行化的MVC / Razor,但ASPX解析/编译引擎大约是内部和私有类/方法的20级。

  1. 编译器应为每个.aspx页面生成第二个代码隐藏文件, 请检查
  2. 在编译期间,aspnet_compiler.exe会将所有网站文件复制到输出目录,包括css,js和images。

使用Web应用程序项目而不是Web站点模型,您将获得更好的编译时间。

我没有针对这个编译器的任何特定热门技巧,但是当我遇到这种问题时,我运行ProcMon来查看该进程在机器上正在做什么,并且我运行Wireshark来检查它是否花费了很多时间 - 对某个注册表项或环境变量中引用的长时间遗忘的计算机的某些网络访问。

只需2美分。

减慢ASP.NET视图预编译的一个-fixednamesaspnet_compiler.exe-fixednames命令行选项。 如果您使用的是Razor / MVC,请不要使用它

从Visual Studio发布wep应用程序时,请确保选择“不合并”,并且不要选择“创建单独的程序集”,因为这是导致全局锁定并减慢速度的原因。

在此输入图像描述

更多信息请访问https://msdn.microsoft.com/en-us/library/hh475319(v=vs.110).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM