你有没有使用ngen.exe?

有没有人曾经使用ngen? 哪里? 为什么? 有没有任何性能改善? 何时何地使用它有意义?

是的,我看到了性能改进。 我的测量结果表明,如果我把自己的程序集放到GAC中,它的确提高了启动性能,因为我的程序集都是有名的。 如果你的程序集有很强的名字,那么NGEN在没有使用GAC的情况下不会有任何改变。

这对我的申请来说不是一个很好的select,因为我们依靠我们公司的常规组装(这也是强有力的命名)。 常见的组件被许多使用许多不同版本的产品所使用,把它们放在GAC中意味着如果我们的一个应用程序没有说“使用特定版本”的常用程序集,它将加载GAC版本,而不pipe什么版本在其执行目录中。 我们认为NGen的好处不值得冒险。

我不是每天都用它,但是它被那些想提高性能的工具所使用; 例如,Paint.NET在安装过程中使用NGEN(或者可能是首次使用)。 这是可能的(虽然我不知道肯定),一些MS工具也可以。

基本上,NGEN在前期进行大部分的JIT,所以冷启动的延迟很小。 当然,在最典型的用法中,并不是100%的代码,所以在某些方面,这会做很多不必要的工作,但是不能提前告知。

国际海事组织的缺点是你需要使用GAC来使用NGEN; 我尝试尽可能避免GAC,以便可以使用robocopy部署(对于服务器)和ClickOnce(对于客户端)。

Ngen主要减less.NET应用程序和应用程序工作集的启动时间。 但它有一些缺点(来自Jeffrey Richter的C#)。

没有知识产权保护

NGen'd文件可能不同步

不良的加载时间性能(重新绑定/绑定)

不良执行时间performance

由于刚刚列出的所有问题,在考虑使用NGen.exe时应该非常谨慎。 对于服务器端应用程序来说,NGen.exe很less或没有意义,因为只有第一个客户端请求遇到性能问题。 未来的客户端请求将以高速运行。 另外,对于大多数服务器应用程序,只需要一个代码实例,所以没有工作集的好处。

对于客户端应用程序,如果一个程序集同时被多个应用程序使用,那么NGen.exe可能会有助于缩短启动时间或减less工作集。 即使在多个应用中不使用组件的情况下,组装也可以改善工作组。 而且,如果NGen.exe用于所有客户端应用程序的程序集,则CLR根本不需要加载JIT编译器,从而进一步减less了工作集。 当然,如果只有一个程序集没有被编译,或者程序集的NG文件不能被使用,那么JIT编译器将会加载,应用程序的工作集将会增加。

ngen大多以改善启动时间而闻名(通过消除JIT编译)。 它可能会改善(通过减lessJIT时间)或降低应用程序的整体性能(因为一些JIT优化将不可用)。

.NET Framework本身在安装时对许多程序集使用ngen

我已经使用它,但只是为了研究目的。 只有在确定部署环境的CPU架构的时候才使用它(它不会改变)

但让我告诉你,JIT编译不是太糟糕,如果你有跨多个cpu环境部署(例如,经常更新的Windows客户端应用程序),那么不要使用NGEN。 这是一个有效的ngencaching取决于许多属性。 如果其中一个失败了,你的程序集又会回落

在这种情况下,JIT是一个明显的赢家,因为它基于其运行的cpu架构在运行中优化代码。 (例如,它可以检测是否有更多的1 CPU)

并且每个版本的clr都会变得越来越好,所以除非你确定了部署环境,否则简单地坚持使用JIT,即使这样你的性能提升也不足以使用ngen.exe(可能会在几百毫秒内增加) – imho – 它不值得努力

也检查此主题上的这个真正不错的链接 – JIT汇编和性能 – 要NGEN还是不NGEN?

是。 在WPF应用程序上使用,以加快启动时间。 启动时间从9秒到5秒。 在我的博客阅读:

我最近发现NGEN能够performance出色。 我目前正在使用的应用程序具有生成的数据访问层(DAL)。 数据库模式非常大,我们也直接在DAL中生成一些数据(值列表)。 结果:很多领域很多,方法也很多。 JIT开销通常在分析应用程序时显示出来,但是在JIT编译和NGEN Isearch之后,虽然不值得。 安装时间的开销,pipe理我的主要关切,使我忽略了标志,而是专注于向应用程序添加更多的function。 当我们将体系结构更改为在64位机器上运行的“任何CPU”时,情况变得更糟:我们的应用程序在单个语句中经历了长达10秒的hover,分析器在问题区域上仅显示JIT开销。 NGEN解决了这个问题:陈述从10秒到1毫秒。 这个声明不是启动程序的一部分,所以我急于想知道在整个启动阶段NGEN的整个应用程序能做些什么。 从8秒到3.5秒。

结论:我真的build议NGEN尝试一下你的应用程序!

作为Mehrdad Afshari关于JIT汇编的评论的补充。 如果通过XmlSerializer和64位系统序列化具有多个属性的类,则SGEN,NGEN组合可能具有巨大的 (在我们的情况下为千兆字节和分钟)的影响。

更多的信息在这里: XmlSerializer启动在64位系统巨大的性能损失,特别是尼克Martyshchenko的答案。

是的,我尝试了一个小型的CPU密集型exe文件,而且它的速度稍微慢一些!

我多次安装并卸载了ngen映像,并运行了一个基准testing。

我总是得到以下时间重现+/- 0.1s:33.9s没有,35.3s与