ngen.exe如何以及何时起作用?

时间:2013-12-16 20:34:12

标签: ngen

我想知道pre-JIT编译(ngen.exe)的好处。 Native Image Generator(NGen)过程的作用是什么?为什么需要它?

请提供一个例子。

4 个答案:

答案 0 :(得分:28)

对于.NET平台上的代码执行,需要将Common Intermediate Language(CIL)表示转换为机器代码。如果在执行之前立即发生这种情况,则称为JIT(即时)编译。 JIT的输出不会保留,因此您的托管应用程序必须在每次启动时都通过JIT。

或者,您可以使用预编译来减少与JIT编译相关的启动开销。 NGen执行预编译并将本机映像保留在本机映像缓存中。然后,应用程序可以使用本机映像运行,并且由于减少了JIT编译开销,可能会遇到更快的启动时间。最初,NGen是一种安装时技术,开发人员使应用程序安装程序发出NGen命令,以在安装期间触发预编译。有关详细信息,请查看http://msdn.microsoft.com/en-us/magazine/cc163808.aspx。本文提供了一个利用NGen的示例应用程序。

在Windows 8(.NET 4.5)中,引入了一种新的NGen模式:“Auto NGen”。基本上,.NET运行时为托管应用程序生成使用日志。当系统空闲时,自动维护任务在后台运行并生成本机映像。这样开发人员就不再需要明确地处理NGen了。请注意,此功能仅对面向Window Store或使用GAC的.NET 4.5+应用程序启用。这是一个可能有用的MSDN页面: http://msdn.microsoft.com/en-us/library/hh691758(v=vs.110).aspx

这是对NGen及相关技术的高级概述: Got a need for speed? .NET applications start faster

最后,.NET框架库本身使用NGen来获得更好的性能。当.NET框架得到服务时,一些本机映像会失效。然后NGen需要运行以重新生成无效的本机映像。这是通过在空闲时间运行的.NET运行时优化服务自动完成的。

答案 1 :(得分:7)

.NET compilation flow

当.NET编译器编译C#或VB.NET代码时,它会编译它们并创建CIL代码。当您运行这个半编译的.NET EXE文件时,JIT在后台运行并将半个CIL代码编译为完整的机器语言。此模式称为普通JIT。

您还可以通过运行完整编译的EXE文件来反过来说您不希望运行时编译。此编译通过使用negen.exe完成。在这种情况下,JIT不会在运行时参与。这被称为预JIT模式。

如果您想了解它们如何影响性能,您可以看到此YouTube视频,该视频演示了正常的JIT和JIT前编辑模式:

Explain JIT, Ngen.exe, Pre-jit, Normal-Jit and Econo-Jit.? (.NET interview questions)

答案 2 :(得分:2)

MSDN

  

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

我在安装过程中使用过NGEN,以便软件启动更快。

答案 3 :(得分:1)

NGen(本机映像生成器)基本上将.NET字节代码(CIL)编译为运行它的计算机的本机代码。好处是,鉴于您每次都没有将代码编译为原生代码,您可以运行它或者需要它,但只需执行一次,应用程序就会启动并运行得更快。如果你想了解更多的信息,那里有很多资源可以解释JIT与提前编译的好处(这就是NGen的作用)。