您的位置:首页 > 编程语言

编译器级别的代码优化对比

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设计已经引入了分支预测技术,如果预测成功,效率自然较高,但如果预测失败,那么便会有比较严重的损失了。因此理论上而言,右边比左边的效率提高不少的。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: