CLR VIA C# 笔记一(1.4)
时间:2011-06-10 来源:Pacer
1.4执行程序集的代码
IL是与CPU无关的机器语言,可将它视为一种面向对象的机器语言.高级语言通常只公开了CLR的所有功能的一个子集,而IL汇编语言允许开发人员访问CLR的所有功能.
若某一高级语言隐藏了需要的CLR功能,那么可以使用IL或者其他公开了这一功能的高级语言来写.这也是CLR其中一个非常出色的特性”混合语言编程”,允许在不同编程语言之间方便地切换,同时又保持紧密集成.
CLR的“即时”编译器(just in time,JIT)会把IL编译成本地CPU指令.
方法的调用图:
一个方法只有在首次调用时才会造成性能损失,以后都无需重新验证IL并把它编译成本地代码,因为JIT编译器将本地CPU指令存储到了动态内存中,当应用程序终止时,代码也会被丢弃,再次运行程序需重新验证IL并编译.
JIT编译器会对本地代码进行优化,托管代码相较于非托管代码的优势:
1. JIT编译器会判断运行在怎样的CPU上,并利用CPU支持的任何特殊指令来提升程序性能,而非托管通常是针对最小功能集合的CPU来编译的.
2. JIT编译器会判断一个特定的测试是否在它运行的机器上总是失败,如果主机只有一个CPU,JIT编译器不会为上树代码生成任何CPU指令,本地代码将针对主机进行优化,最终代码变得更小,执行得更快.
3. CLR可以评估代码的执行,并将IL重新编译成本地代码.
.NET Framework SDK 提供的NGen.exe工具可以将程序集的所有IL代码编译成本地代码,并保存到磁盘文件中.在运行时,一旦加载这个程序集,CLR会判断是否存在这个程序集的预编译版本并优先加载,这样可以避免运行时进行编译.但NGen.exe生成的代码不会像JIT编译器生成的代码那样高度优化.