因此,当CLR运行时加载.NET程序集时,它会将其编译为计算机本机代码。这个过程被称为JITing。NGen也是将.NET程序集编译为本机代码的过程。我不明白两者之间的区别是什么?
发布于 2011-04-03 02:40:17
不同之处在于它们何时发生。JIT编译是在程序运行时进行的。NGen通常是在程序安装时完成的,在程序运行之前发生。NGen的目标之一是消除应用程序启动时的JIT惩罚。
发布于 2011-04-03 02:41:30
JIT只针对每个方法进行;它不会JIT所有的东西……只需要你需要的部分。当然,这在第一次进入一个方法(加上泛型等)时会有一个小的但可测量的打击。NGEN预先完成了这项工作,但必须在相同的平台/架构等上完成-本质上是对机器进行。这也意味着将其添加到GAC等,这可能需要更高的访问权限。
在许多情况下,JIT是很好的,特别是如果应用程序打开了很长时间(例如web服务器)。
发布于 2012-10-30 21:20:28
还没有提到的一个非常重要的区别是,本地缓存图像具有“共享代码页”,这使得在终端服务或Citrix上运行的应用程序的内存占用有很大的不同。
要理解的关键一点是,在它编译你的代码的同时,它也将代码页标记为可共享的,这样你的应用程序的多个实例就可以共享第一个实例所使用的部分内存空间。如果你在终端服务下运行,这真的很有用。
http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx。
这对于在一台机器上由多个用户使用的应用程序具有非常重要的意义,因为它们在进程之间共享内存。如果图像缓存没有得到很好的维护,这可能会导致非常奇怪的、难以再现的行为和资源管理问题。
https://stackoverflow.com/questions/5525082
复制相似问题