.NET Framework性能——JIT编译器
在编译任何.NET应用程序时,编译器把源代码转换为Microsoft中间语言(MSIL)。MSIL不在任何具体的处理器上执行,事实上,MSIL被设计为处理器独立的。要在一个具体的环境中执行应用程序,一个JIT编译器接受MSIL输出并把指令转换为主机处理器的本机指令,JIT编译器以即时方式编译代码,以便应用程序开始执行。
JIT编译器不像传统的编译器,比如C++编译器,有那么多时间进行优化。和开发期间运行于机器上的传统编译器不同的是,最终用户在等待JIT编译器完成,以便程序运行。JIT编译器仍然抽出时间进行一定数量的优化,它每次只对程序的几个小的部分进行编译,每当执行到达程序集中的一个还没有被JIT编译的方法时,JIT编译器就只编译这个目前等待执行的方法,然后把结果保存起来用于将来对同一方法的调用,知道应用程序结束。这项技术意味着应用程序永远不会把编译时间浪费在不使用的方法上。
JIT编译器在生成本机指令时执行一些的优化,包括子表达式的清除,循环的展开和方法内联。这些优化都是.NET自带的优化,我们无法控制。
内联(inlining)是编译器用方法本身的指令代替对该方法调用的一种优化。编译器在看到可以大幅度节省开销的机会时就会内联一个方法。小方法是内联的最佳对象,因为栈帧设置、分支和返回的开销在成本和大小上经常大于方法本身的代码量。
在执行前才进行编译也有一些优势。编译器将了解运行时环境的具体特征,能够为主机CPU提供具体的指令。编译器能够在RAM有限的平台上进行大幅度的内存优化,而利用速度较快的机器的处理能力进行速度的优化。
在程序从源代码到MSIL,然后到主机CPU的本机代码过程中,有许多进行优化的机会。