📜  .NET中的什么是即时(JIT)编译器

📅  最后修改于: 2021-05-29 16:47:53             🧑  作者: Mango

即时编译器(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编译为机器代码,因此不需要运行时编译,并且可以本地执行机器代码文件。