日期:2014-05-20  浏览次数:20684 次

问一个JIT解析MSIL的过程的问题
最近看了一个,“在.net开发中几个重要的认识误区”的帖子
写的气势磅礴的。
其中第一点写到:
一、.net程序再运行一次就会更快
许多人对此的解释是:.net程序第一次运行时会被编译成本地代码,所以再次运行会更快。但遗憾的是,其实每次运行,那些IL都会被翻译一次,不会保留下来。所以并不会变快。但为什么有时候真的觉得快了呢?其实所有程序都是这样,这是Windows再为你缓存用过的组件。真正需要CPU时间的程序,多运行是不会加快速度的。

这几乎颠覆了我对.net的理解。我以前看到的资料都是说JIT足够智能,能判别该代码是否已经被编译成本地代码。不会编译第二遍的。我认为也应该是这样,不然微软干嘛这么弱智?

或者折中的说:编译成的二进制代码保存在Windows缓冲区,不用编译第二次。但是系统重启等把缓冲区内容清除的操作后,又要重新编译一次?

另外JAVA的.class文件它编译成二进制代码的过程是什么?是编译一次还是每次都编译一遍?

再来一个问题吧:.net为什么不把MSIL直接弄成二进制代码呢,非要等到运行的时候才编译?反正.net又不用像JAVA那样要跨操作系统的平台。所以.net完全可以这样做啊,提高运行效率不少呢。至少在NT系列的系统,程序都是兼容的吧。
谢谢,很困惑啊。

------解决方案--------------------
这其实是一个问题
JIT编译器不确定代码将来会运行在何种处理器上
所以JIT只能根据运行时处理器的类型来进行即时编译
Java也是每次都编译一遍
不管是Microsoft还是Sun都无法预计你对机器硬件的升级