新闻  |   论坛  |   博客  |   在线研讨会
gcc不同优化级别反汇编代码的分析
tongxin | 2009-04-12 23:37:21    阅读:6994   发布文章

不同优化级别下加法性能分析
%A 在现代c编译器中,一个最让人心动的特性是优化。优化是编译器的一部分,它可以检查代码(或者把编译器生成的代码组合起来),指出未达到最优化的部分,并且重新生成它们,这样使程序更节省空间,表现更完美。gcc也不例外,它拥有强大的并且是可以配置的优化器,对程序进行处理。在gcc中,可以使用其中一个-O选项对代码进行优化。可以为gcc指定优化的不同级别。如果只是简单的使用-O,将使用第一级别的优化(或者-O1)。-O和-O1等同。通常使用第三级别的优化。也可以使用-O2或者-O3来代替-O,这些选项决定了gcc的优化级别,数字越高,gcc优化的等级就越高。高的优化等级意味着程序运行得更快。
%A 优化有时可以给程序带来更优异的表现。但是这也潜在着一些危险。首先,使用越高等级的优化策略,编译程序的时间就越长。因此在集中开发的时候,最好不要使用优化选项,而当版本发行的时候或者开发工作快结束的时候,在使用优化。第二,一些优化选项,特别是-O3,会增大程序的体积。通常这种变化不是很巨大,但是有时候就必须引起注意了。如果程序要求使用更多的RAM,当运行的时候,就需要更多的交换空间,它带来的负面影响可能比获益还要大。最后,当使用优化选项的时候,调试可能会变得比较困难。只是因为优化器可能删除在最终版本中不用的代码,或者为了取得更优异的表现而重组许多声明,那么跟踪执行文件将变得非常困难。因此在调试的时候,尽量避免使用优化选项。
%A 通常使用-O2选项就可以了,这个选项在优化长度、编译时间和代码大小之间取得了最佳的折衷方案。
%A
%A 加法性能测试结果:
%A 测试数据:op1=0x7fffffff op2=0x7fffffff ;测试次数:1,0000,0000
%A 正确输出结果:the result of add is :0xfffffffe
%A               ZF:1 NF:0 CF:0 OF:1
%A
%A 函数名                普通编译方式        采用 -O1优化        采用-O2优化        采用-O3优化
%A
%A ADD0        real        0m2.293s        0m1.982s        0m1.820s        0m0.455s
%A         user        0m2.280s        0m1.980s        0m1.820        0m0.450s
%A         sys        0m0.000s        0m0.000s        0m0.000s        0m0.000s
%A
%A ADD1        real        0m2.372s        0m1.992s        0m1.834s        0m0.457s
%A         user        0m2.370s        0m1.990s        0m1.830s        0m0.460s
%A         sys        0m0.000s        0m0.000s        0m0.000s        0m0.000s
%A
%A ADD2        real        0m2.514s        0m2.076s        0m2.214s        0m0.458s
%A         user        0m2.510s        0m2.080s        0m2.220s        0m0.450s
%A         sys        0m0.000s        0m0.000s        0m0.000s        0m0.000s
%A
%A ADD3        real        0m3.813s        0m2.621s        0m2.674s        0m0.400s
%A         user        0m3.810s        0m2.620s        0m2.670s        0m0.400s
%A         sys        0m0.000s        0m0.000s        0m0.000s        0m0.000s
%A
%A ADD4        real        0m3.288s        0m2.270s        0m2.266s        0m0.490s
%A         user        0m3.290s        0m2.270s        0m2.260s        0m0.490s
%A         sys        0m0.000s        0m0.000s        0m0.000s        0m0.000s
%A
%A
%A
%A 在计算机体系结构设计中,为了提高执行部件的处理速度,经常在部件中采用流水线技术,来提高性价比。所谓流水线技术,是指将一个重复的时序过程,分解成为若干个子过程,而每一个子过程都可有效地在其专用功能段上与其他自过程同时执行。吞吐率是衡量流水线速度的重要指标,它是指在单位时间内流水线所完成的任务数或输出结果的数量。对指令流水线来说,如果如果流水线中的每条指令都相互独立,则可以充分发挥基本流水线的性能,但在实际中,流水线中流动的指令极有可能会相互依赖,即它们之间存在着相关关系。一般来说,流水线中的相关主要分为以下三种类型:1)结构相关:当指令在重叠执行过程中,硬件资源满足不了指令重叠执行的要求,发生资源冲突时将产生“结构相关”。2)数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起“数据相关”。3)控制相关:当流水线遇到分支指令和其他会改变PC值的指令时就会发生“控制相关”。一旦流水线中出现相关,必然会影响指令在流水线中的顺利执行,从而影响流水线的性能。
%A 现在以ADD0.c程序为例,分析该程序在不同的优化级别下核心函数部分的反汇编代码,来说明以上性能上的优化是如何取得的。
%A 普通编译方式下,整个汇编过程只用到了寄存器EAX、EBP、ECX和EDX指令之间的数据相关频繁出现;分支指令为做出处理,导致代码重复,执行效率降低。
%A 采用-O1进行优化后程序的执行效率比普通编译方式提高了15.69%,这是由于编译过程中增加了寄存器EDI、ESI和EBX在很大程度上减少了指令间的数据相关,并且调整了部分指令的指令的执行顺序,降低了指令间的数据相关。
%A 采用-O2进行优化后程序的执行效率 比普通编译方式提高了25.99%,这是由于-O2选项在-O1选项的基础上,进一步调整指令顺序来减少指令间的数据相关,而且对控制相关进行了处理,首先,采用从前调度的方式来填充分支的延时槽;利用“预测分支成功”的方法来降低流水线的分支损失。
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客