即时编译器(JIT)是.NET中公共语言运行时(CLR)的一部分,它负责管理.NET程序的执行,而不管任何.NET编程语言如何。特定于语言的编译器将源代码转换为中间语言。然后,该中间语言由即时(JIT)编译器转换为机器代码。该机器码特定于JIT编译器在其上运行的计算机环境。
JIT编译器的工作:需要JIT编译器以加快代码执行速度并提供对多个平台的支持。其工作方式如下:
JIT编译器将Microsoft中间语言(MSIL)或通用中间语言(CIL)转换为机器代码。这是在执行MSIL或CIL之前完成的。根据需求将MSIL转换为机器代码,即JIT编译器根据需要而不是全部编译MSIL或CIL。存储已编译的MSIL或CIL,以便在需要时可用于后续调用。
即时编译器的类型:JIT编译器有3种类型,如下所示:
- JIT预编译器:使用Pre-JIT编译器在一个编译周期中将所有源代码同时编译为机器代码。此编译过程在应用程序部署时执行。而且此编译器始终在Ngen.exe(本机图像生成器)中实现。
- 普通JIT编译器:运行时所需的源代码方法在首次由“普通JIT编译器”调用时被编译为机器代码。之后,它们将存储在高速缓存中,并在再次调用它们时使用。
- Econo JIT编译器:Econo JIT编译器将运行时所需的源代码方法编译为机器代码。在不再需要这些方法之后,将其删除。从dotnet 2.0开始,此JIT编译器已过时
JIT编译器的优点:
- JIT编译器需要较少的内存使用量,因为JIT编译器仅将运行时所需的方法编译为机器代码。
- 通过使用JIT编译器可以减少页面错误,因为在一起所需的方法很可能在同一内存页面中。
- JIT编译器可以在代码运行时执行基于统计分析的代码优化。
JIT编译器的缺点:
- 在最初执行应用程序时,JIT编译器需要更多的启动时间。
- JIT编译器大量使用高速缓存存储器来存储运行时所需的源代码方法。
注意:可以使用Ahead-of-time(AOT)编译来解决JIT编译器的许多缺点。这涉及将MSIL编译为机器代码,因此不需要运行时编译,并且可以本地执行机器代码文件。