GCC,比较使用-O2的效果并使用它打开的所有优化标志

时间:2017-09-26 18:25:39

标签: gcc optimization

来自gcc5.4 documentation,它说

  

-O2打开-O指定的所有优化标志。它还会打开以下优化标志:

     

-fthread-跳跃             -falign-functions -falign-jumps             -falign-loops -falign-labels             -fcaller,节省             -fcrossjumping             -fcse-follow-jumps等

使用-O2似乎与使用gcc 5.4.0中-O2打开的所有83个优化标志对测试程序的性能具有相同的效果。

但是,我比较了可执行文件test1和

获得的test2的运行时间
  

gcc-5.4 -O2 test.c -o test1

  

gcc-5.4 -fauto-inc-dec   -fbranch-数-REG   -fcombine堆栈,调整   -fcompare-elim ... -fthread-jumps -falign-functions ...(所有83个标志)test.c -o test2

我测试了20个随机生成的c程序并运行每个测试用例100000次,以确保运行时间的测量足够准确。 但结果是使用-O2平均比使用所有83个标志快约60%。

我真的很困惑为什么使用-O2的效果不等于使用它打开的所有优化标志。

我必须误解某些东西,但我还没有找到任何解释。我很感激任何帮助。非常感谢。

2 个答案:

答案 0 :(得分:1)

这是一个常见的问题。为了启用(或禁用)特定的优化,您必须首先启用优化程序,即使用-O0标记之一,-O(或仅-O1除外,这相当于<a [routerLink]="'/section-start'" routerLinkActive="selected">Section Start</a> )。

答案 1 :(得分:0)

除了确定运行哪些传递之外,优化级别还会影响编译器其他部分的决策。这些可以在强制过程中进行,例如在代码的内部表示,寄存器分配等之间进行转换,因此优化级别并不完全等同于一组启用每个编译器的开关。 请查看this thread,了解有关此主题的一些讨论。