JIT vs NGen - 有什么区别?

因此,当CLR运行时加载.NET程序集时,它会将其编译为计算机本机代码。此过程称为JITing。 NGen也是将.NET程序集编译为本机代码的过程。我不明白两者有什么区别?     
已邀请:
不同之处在于它们何时发生。程序运行时会发生JIT编译。 NGen通常在程序安装时完成,并在程序运行之前完成。 NGen的目标之一是从应用程序启动中删除JIT惩罚。     
JIT只按每个方法完成;它没有JIT一切......只有你需要的东西。当然,这在第一次进入方法时会有一个小但可测量的命中(加上泛型等)。 NGEN预先做好了这项工作,但必须在相同的平台/架构等基础上完成 - 基本上就是那台机器。这也意味着将其添加到GAC等,这可能需要更高的访问权限。 在许多情况下,JIT很好,特别是如果应用程序长时间打开(例如Web服务器)。     
尚未提及的一个非常重要的重要区别是本机缓存图像具有“共享代码页”,这使通过终端服务或Citrix运行的应用程序的内存占用量产生巨大差异。   理解NGEN的关键在于,虽然它编译代码,但它也将代码页标记为可共享,因此应用程序的多个实例可以共享第一个实例使用的部分内存空间。如果你在终端服务下运行,这真的很有用。 http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx。 这对于多个用户在单个计算机上使用的应用程序具有非常重要的意义,因为它们跨进程共享内存。如果图像缓存没有得到很好的维护,这可能会导致非常奇怪,难以重现的行为和资源管理问题。     
来自MSDN ......   Native Image Generator(Ngen.exe)是一种可以提高托管应用程序性能的工具。 Ngen.exe创建本机映像,这些映像是包含已编译的特定于处理器的计算机代码的文件,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用来自缓存的本机映像,而不是使用实时(JIT)编译器来编译原始程序集。 http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx 基本上NGen允许您预先JIT并在本地计算机上缓存程序集。这允许更快的启动和有时执行。     
这里遗漏了很多细节,但是: Jit并不是那么... Jit是Just-In-Time,这意味着在实际调用代码(例如方法)之前,它不会被编译为本机代码。在那之前只有存根。这将保持缓存,以便后续调用该方法不会重新生成本机代码。 NGen立即完成整个组装。 NGen一次完成所有操作,因此不需要Jitting。     

要回复问题请先登录注册