32

因此,当 CLR 运行时加载 .NET 程序集时,它会将其编译为机器本机代码。这个过程称为 JITing。NGen 也是将 .NET 程序集编译为本机代码的过程。我不明白两者有什么区别?

4

5 回答 5

32

不同之处在于它们何时发生。JIT 编译发生在您的程序运行时。NGen 通常在程序安装时完成,并且发生在程序运行之前。NGen 的目标之一是消除应用程序启动时的 JIT 损失。

于 2011-04-02T18:40:17.453 回答
16

JIT 仅按方法完成;它不会 JIT 一切...只有您需要的位。当然,这对第一次方法(加上泛型等)有一个小但可测量的影响。NGEN 预先完成这项工作,但必须在相同的平台/架构等上完成 - 基本上是那台机器。这也意味着将其添加到可能需要更高访问权限的 GAC 等。

在许多情况下,JIT 很好,特别是如果应用程序长时间打开(例如 Web 服务器)。

于 2011-04-02T18:41:29.747 回答
9

一个尚未提及的非常重要的区别是本机缓存图像具有“共享代码页”,这对在终端服务或 Citrix 上运行的应用程序的内存占用产生了巨大的影响。

了解 NGEN 的关键在于,它在编译您的代码的同时,还将代码页标记为可共享,以便您的应用程序的多个实例可以共享第一个实例使用的部分内存空间。如果您在终端服务下运行,这将非常有用。

http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

这对于在单个机器上由多个用户使用的应用程序具有非常重要的意义,因为它们在进程之间共享内存。如果图像缓存没有得到很好的维护,这可能会导致非常奇怪的、难以重现的行为和资源管理问题。

于 2012-10-30T13:20:28.003 回答
7

从 MSDN...

本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机映像,而不是使用即时 (JIT) 编译器来编译原始程序集。

http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

基本上 NGen 允许您在本地机器上进行预 JIT 和缓存程序集。这允许更快的启动和有时执行。

于 2011-04-02T18:39:41.203 回答
3

这里省略了很多细节,但是:

Jit 不完全是……Jit 是即时的,这意味着在实际调用代码(例如方法)之前,它不会被编译为本机代码。在那之前只有存根。这将保持缓存,以便对该方法的后续调用不会重新生成本机代码。

NGen 一次完成整个组装。NGen 一次完成所有操作,因此不需要 Jitting。

于 2011-04-02T18:41:36.237 回答