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

《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重新编译成本机代码。重新编译的代码可以重新组织,根据刚才观察到的执行模式,减少不正确的分值预测。


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


  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

刚刚凉

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值