来自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的效果不等于使用它打开的所有优化标志。
我必须误解某些东西,但我还没有找到任何解释。我很感激任何帮助。非常感谢。
答案 0 :(得分:1)
这是一个常见的问题。为了启用(或禁用)特定的优化,您必须首先启用优化程序,即使用-O0
标记之一,-O
(或仅-O1
除外,这相当于<a [routerLink]="'/section-start'" routerLinkActive="selected">Section Start</a>
)。
答案 1 :(得分:0)
除了确定运行哪些传递之外,优化级别还会影响编译器其他部分的决策。这些可以在强制过程中进行,例如在代码的内部表示,寄存器分配等之间进行转换,因此优化级别并不完全等同于一组启用每个编译器的开关。 请查看this thread,了解有关此主题的一些讨论。