【发布时间】:2011-07-28 08:38:46
【问题描述】:
因此,当 CLR 运行时加载 .NET 程序集时,它会将其编译为机器本机代码。这个过程称为 JITing。 NGen 也是将 .NET 程序集编译为本机代码的过程。我不明白两者有什么区别?
【问题讨论】:
因此,当 CLR 运行时加载 .NET 程序集时,它会将其编译为机器本机代码。这个过程称为 JITing。 NGen 也是将 .NET 程序集编译为本机代码的过程。我不明白两者有什么区别?
【问题讨论】:
区别在于它们发生的时间。 JIT 编译发生在您的程序运行时。 NGen 通常在程序安装时完成,并且发生在程序运行之前。 NGen 的目标之一是消除应用程序启动时的 JIT 损失。
【讨论】:
JIT 到底需要什么?
JIT 仅按方法完成;它不会 JIT 一切...只有您需要的位。当然,这对第一次方法(加上泛型等)有一个小但可测量的影响。 NGEN 预先完成这项工作,但必须在相同的平台/架构等上完成 - 本质上是那台机器。这也意味着将其添加到 GAC 等,这可能需要更高的访问权限。
在许多情况下,JIT 很好,特别是如果应用程序长时间打开(例如 Web 服务器)。
【讨论】:
尚未提及的一个非常重要的区别是本机缓存图像具有“共享代码页”,这对在终端服务或 Citrix 上运行的应用程序的内存占用产生了巨大的影响。
了解 NGEN 的关键在于,它在编译您的代码的同时,还将代码页标记为可共享,以便您的应用程序的多个实例可以共享第一个实例使用的部分内存空间。如果您在终端服务下运行,这将非常有用。
这对于由多个用户在单台机器上使用的应用程序具有非常重要的意义,因为它们在进程之间共享内存。如果图像缓存没有得到很好的维护,这可能会导致非常奇怪、难以重现的行为和资源管理问题。
【讨论】:
来自 MSDN...
本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。 Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机图像,而不是使用即时 (JIT) 编译器来编译原始程序集。
http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx
基本上,NGen 允许您在本地机器上进行预 JIT 和缓存程序集。这可以加快启动速度,有时还可以加快执行速度。
【讨论】:
这里省略了很多细节,但是:
Jit 不完全是……Jit 是即时的,这意味着它不会被编译为本机代码,直到代码(例如方法)被实际调用。在那之前只有存根。这将保持缓存,以便对该方法的后续调用不会重新生成本机代码。
NGen 一次完成整个组装。 NGen 一次完成所有操作,因此不需要 Jitting。
【讨论】: