编译器级别的代码优化对比
2014-06-12 00:46
387 查看
1、实验目的
在编程语言中,对比不同编程风格的代码写法,或者通过使用不同的编译器和编译优化参数,通过编译器生成汇编代码,静态分析所生成汇编代码的运行效率。2、实验平台、工具
Windows平台、VC6.0工具、UltraCompare工具。(wintc32位的用不了,我机子是64位,所以个人改用vc6.0编译)3、实验设计
对下面两种循环相加的两套代码编译及反汇编:代码1:
main() { int sum = 0; int i; int array[100]; for(i = 0; i < 100; i++)//数组赋值 { array[i] = i; } for (i = 0; i < 100; i++)//循环相加 { sum += array[i]; } }代码2:
main() { int sum1 = 0, sum2 = 0; int i,sum; int array[100]; for(i = 0; i < 100; i++)//数组赋值 { array[i] = i; } for (i = 0; i < 100; i += 2)//循环相加 { sum1 += array[i]; sum2 += array[i + 1]; } sum = sum1 + sum2; }
使用相同的优化参数生成汇编代码,对比。
对两个汇编代码用UC对比:
5、实验结果讨论
对比上述汇编代码,明显可以看出的是虽然相加方式不一样,但是两段汇编代码的计算次数其实是一样的,但是左边那种实现方式的跳转(jmp,左边的99行,右边108行)次数却明显比右边多,因为左边是间隔1就跳转,右边是间隔2跳转。下面说下我的想法:从算法上看,两者完全相同,但是对于CPU来说,右边做法比左边做法性能要高。首先,右边代码与前者相比,一个循环内部有两个完全不相关的加法运算,这样CPU便有机会将他们并行地执行,于是性能便会更好一些。其次,右边做法的条件跳转次数少,一般来说性能就会更好一些。因为条件跳转直到最后一刻才知道要跳向何方,因此CPU流水线就很难对代码的走向进行预测了。当然,现在CPU设计已经引入了分支预测技术,如果预测成功,效率自然较高,但如果预测失败,那么便会有比较严重的损失了。因此理论上而言,右边比左边的效率提高不少的。
相关文章推荐
- 编译器级别的代码优化对比
- JDT编译器对Java代码的编译优化一瞥
- c#编译器的减少冗余代码优化
- 一个关于防止编译器优化特定代码的问题
- volatile与编译器代码优化浅析
- 编译器,优化,及目标代码生成.
- Bug经典回放四--别让编译器优化掉你想要执行的代码
- [算法]代码运行时间增长数量级对比 线性级别N vs 线性对数级别 NlgN
- PHP代码优化之成员变量获取速度对比
- PHP代码优化之成员变量获取速度对比
- C编译器剖析_5.2.1 中间代码生成及优化_布尔表达式的翻译
- 代码运行效率的简单测试(编译器,反射,优化后的反射)
- 修改了别人的代码、优化前与优化后的对比,唉,写个好代码真不容易啊
- c# 编译器优化的功劳?与泛型有关的代码的疑惑
- PHP代码优化 成员变量获取速度对比
- 复习笔记10 switch 编译器优化的两种方式 和if的效率对比
- 实例分析: 如何对比JIT优化前后的汇编代码
- 修改了别人的代码、优化前与优化后的对比,唉,写个好代码真不容易啊
- 使用Intel编译器(3)HLO(1)高级别优化的选项和使用
- C编译器剖析_5.2.4 中间代码生成及优化_后缀表达式的翻译