GAC下的一切都是预编译(ngened)的吗?如果是这样,那么所有的.NET都是预编译的,所以CLR不可能在运行时对它们进行优化?
比如,如果你在应用程序中使用List,那么CLR将无法优化列表本身,而只能优化它在应用程序中的使用方式?这不是违背了JIT在运行时获得大量优化的目的吗?因此,实际上失去了对BCL的所有潜在优化?
发布于 2009-03-17 21:40:11
不,GAC不会自动进行预JIT;但是,GAC是预JIT的先决条件。实际上,只有一小部分东西是预JIT的。此外,如果BCL是预JIT的,那么这些优化已经由NGEN 完成了,所以“失去所有潜在的优化”是不成问题的。
发布于 2009-03-17 22:54:16
GAC可以包含非ngen的代码(在使用ngen时,它必须包含ngen以及本机映像,因为ngen的映像不包含所有需要的元数据)。Ngen'd代码要求dll安装在GAC中才能有效地工作(从技术上讲,您可以在没有安装的情况下执行此操作,但生成的名称验证无论如何都会触发对dll的完全读取,这可能会使您的启动时间变得更糟)。
在3.5NGEN之前,sp1的编译与运行时有一些细微的不同,更多细节见this article。我想这对于3.5SP1仍然适用,因为这些问题很难解决。
由于ngen实际上只为您带来了两大成功,因此您应该考虑其中之一/两者在您的场景中是否都很重要,以证明与使用它们相关的复杂性和成本。
的开销,但
我建议This article detailing some of the changes in the 2.0 ngen是一个很好的读物,它涵盖了像硬绑定这样的东西,这是一个很大的改进,并提供了关于编写高效托管代码的优秀通用文档的链接,尽管它受到了链接损坏的影响,请参阅它所指的msdn Chapter 5。(请注意,该文档是旧的,但许多主题仍然有效)
发布于 2009-03-17 21:41:08
否,全局程序集缓存未预编译。
较新版本的框架确实有一个在后台运行的优化服务,该服务执行一些预编译。但是,当它在目标系统上运行时,它所做的所有预编译都针对该特定系统进行了优化。
https://stackoverflow.com/questions/656140
复制相似问题