专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > .NET分析设计

托管代码一定比非托管代码性能低吗?解决思路

发布时间:2011-06-23 20:18:18 文章来源:www.iduyao.cn 采编人员:星星草
托管代码一定比非托管代码性能低吗?
 众所周知,在托管环境中,代码的编译需要经过两个阶段才能完成的。首先,面向通用语言运行时的编译器扫描源代码将其编译成中间代码(IL)和元数据等组成的托管模块;其次才是在运行时通过JIT编译器即时编译为本地的CPU指令集。我们认为基于这些原因,托管代码就一定比非托管代码性能低。
        我觉得这样的论调是不一定正确的,首先,在运行时某个方法IL代码被JIT编译器及时编译为本地CPU指令,这会产生一定的性能损失,这是肯定的,但是对该方法的后续调用都将以本地代码做全速执行,我想大家想一想也能记起来。
        其次,如果应用程序在一些新型的CPU上运行,非托管应用程序通常被编译为面向具有最小通用功能的CPU平台,一般会避免使用新型CPU提供的特殊指令,而我们的JIT编译器能够检测到这种情况,并能产生利用这些特殊指令的本地代码。
        还有大家都能确定的一点是,JIT编译器能检测到某些总是返回错误的布尔测试,将不会产生任何CPU指令。
        最后,在程序运行时,通用语言运行时(CLR)能够分析代码的执行情况,并有选择的将IL代码编译为本地CPU指令。
       综上,我觉得如果说托管代码一定比非托管代码性能低,这是不一定的,希望大家能够积极讨论我的论点的正确性。
------解决方案--------------------
众所周知,在托管环境中,代码的编译需要经过两个阶段才能完成的。首先,面向通用语言运行时的编译器扫描源代码将其编译成中间代码(IL)和元数据等组成的托管模块;其次才是在运行时通过JIT编译器即时编译为本地的CPU指令集。我们认为基于这些原因,托管代码就一定比非托管代码性能低。

多数情况下确实如此

        我觉得这样的论调是不一定正确的,首先,在运行时某个方法IL代码被JIT编译器及时编译为本地CPU指令,这会产生一定的性能损失,这是肯定的,但是对该方法的后续调用都将以本地代码做全速执行,我想大家想一想也能记起来。

由于及时编译受到运行时间限制很可能比有充分时间编译的静态编译方法优化不充分

        其次,如果应用程序在一些新型的CPU上运行,非托管应用程序通常被编译为面向具有最小通用功能的CPU平台,一般会避免使用新型CPU提供的特殊指令,而我们的JIT编译器能够检测到这种情况,并能产生利用这些特殊指令的本地代码。

这取决于编译器的支持,如果jit版本老旧同样不能支持新cpu,新的c编译器一样支持新cpu

        还有大家都能确定的一点是,JIT编译器能检测到某些总是返回错误的布尔测试,将不会产生任何CPU指令。

检测就需要时间

        最后,在程序运行时,通用语言运行时(CLR)能够分析代码的执行情况,并有选择的将IL代码编译为本地CPU指令。
同上 由于及时编译受到运行时间限制很可能比有充分时间编译的静态编译方法优化不充分
------解决方案--------------------
同意楼主的说法。

但是想补充一点,非托管代码也是有优化的,例如 Intel c++ complier, openMP 等等,而且优化的效率非常的明显。
不过这一切都是要归结到程序员会不会用这个问题上面来。

程序员的“性能”才是程序效率的关键,而不是编程语言。
------解决方案--------------------
lz的论据很对,但是结论不对。要注意普遍和一般,通常和极端,多数和少数。

这就好比新闻报道和广告词,通过选择性的事实,完全可以在所说都是正确的情况下骗你没商量。
------解决方案--------------------
我感觉C#比C++慢在大部分情况下是一定的,只是这种慢在大部分情况下是可以容忍的。
如果各方面都比C/C++好,就没有人用C/C++了。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: