这里有人用过ngen吗?哪里?为什么?是否有任何性能改进?在何时何地使用它是有意义的?
发布于 2009-04-04 12:37:24
是的,我看到了性能上的改进。我的测量表明,如果我还将我的程序集放入GAC中,它确实提高了启动性能,因为我的程序集都是强名称的。如果你的程序集是强名称的,NGen在不使用GAC的情况下不会有任何不同。这样做的原因是,如果您有不在GAC中的强名称程序集,则.NET运行时会通过从磁盘加载整个托管程序集来验证您的强名称程序集是否未被篡改,这样它就可以绕过NGen的主要优点之一进行验证。
对于我的应用程序来说,这不是一个很好的选择,因为我们依赖于我们公司的公共程序集(也是强命名的)。通用程序集被许多使用许多不同版本的产品使用,将它们放在GAC中意味着如果我们的某个应用程序没有指定其中一个通用程序集的“使用特定版本”,它将加载GAC版本,而不管它的执行目录中是什么版本。我们认为NGen的好处不值得冒险。
发布于 2009-04-04 12:24:17
我不是日常使用它,但它是由希望提高性能的工具使用的;例如,Paint.NET在安装过程中(或者可能是第一次使用)使用NGEN。这是可能的(虽然我不确定),一些MS工具也可以。
基本上,NGEN预先执行了程序集的大部分JIT,因此在冷启动时几乎没有延迟。当然,在大多数典型的使用中,并不是100%的代码都能达到,所以在某些方面这会做很多不必要的工作--但它不能提前知道这一点。
IMO的缺点是,您需要使用GAC来使用NGEN;我尽量避免使用GAC,这样我就可以使用robocopy-deployment (到服务器)和ClickOnce (到客户机)。
发布于 2009-04-04 12:49:10
Ngen主要是减少.NET应用程序和应用程序工作集的启动时间。但它也有一些缺点(从CLR到Jeffrey Richter的C# ):
没有知识产权保护
下一代文件可能不同步
较低的加载时间性能(重新基址/绑定)
执行时性能较差
由于刚才列出的所有问题,在考虑使用NGen.exe时应非常谨慎。对于服务器端应用程序,NGen.exe几乎没有意义,因为只有第一个客户端请求会受到性能影响;以后的客户端请求会高速运行。此外,对于大多数服务器应用程序,只需要代码的一个实例,因此没有工作集的好处。
对于客户端应用程序,如果程序集同时由多个应用程序使用,则NGen.exe可能有助于缩短启动时间或减少工作集。即使在一个程序集没有被多个应用程序使用的情况下,生成一个程序集也可以改善工作集。此外,如果NGen.exe用于客户端应用程序的所有程序集,则CLR根本不需要加载JIT编译器,从而进一步减少了工作集。当然,如果只有一个程序集没有NGen'd,或者如果一个程序集的NGen'd文件不能使用,那么JIT编译器就会加载,应用程序的工作集就会增加。
https://stackoverflow.com/questions/716983
复制相似问题