托管应用程序的性能优于非托管应用程序?

来源:互联网 发布:淘宝卖保健品填厂家 编辑:程序博客网 时间:2024/06/07 09:22

《CLR via C#》中作者的一句话一直让我铭记,颠覆的我的三观:

“虽然你可能很难相信,但许多人(包括我)都认为托管应用程序的性能实际上已经超越了非托管应用程序”!

JIT编译器是以函数为单位解析IL到机器码的,而且解析只发生在第一次调用,将解析的机器码放在指定内存中,以后再调用这个函数就会从该内存中直接调用机器码而不需要解析。如果所有函数都调用一遍,以后再调用就跟非托管一样直接调用机器码,效率会一样,问题是总得有第一次调用吧!怎么会比非托管快呢???而且现在主流的追求效率的服务器Apache, Nginx甚至NodeJS都是C++的。。。

书上的解释视乎也合理,概括说就是非托管代码以“统一”方式生成机器码比JIT编译器“因地制宜”效率更差。

托管代码相比较于非托管代码的优势:

1. JIT编译器能判断应用程序是否运行在inter Pentium 4 CPU上,并生成相应的本机代码来利用 Pentium 4支持的任何特殊指令。相反,非托管应用程序通常是针对具有最小功能集合的CPU编译的,不会使用提升性能的特殊指令。

2.JIT编译器能判断一个特定的测试在它运行的机器上是否总是失败。例如:

   if(numberOfCPUs > 1){...} 如果主机只有一个CPU,JIT编译器不会为上述代码生成任何CPU指令。

3.应用程序运行时,CLR可以评估代码的执行,并将IL重新编译成本机代码。重新编译的代码可以重新组织,根据刚才观察到的执行模式,减少不正确的分值预测。


个人认为,不能一概的下结论说谁比谁强,因应用程序不同而不同吧!


原创粉丝点击