Gcc 比较使用-O2和使用它打开的所有优化标志的效果

Gcc 比较使用-O2和使用它打开的所有优化标志的效果,gcc,optimization,Gcc,Optimization,它说,从 -O2打开-O指定的所有优化标志。它还打开以下优化标志: -fthread跳转 -falign功能-falign跳跃 -falign循环-falign标签 -fcaller保存 -跳高 -fcse跟随跳跃等 似乎使用-O2与使用gcc 5.4.0中-O2打开的所有83个优化标志对测试程序性能的影响相同 但是,我比较了通过以下方式获得的可执行文件test1和test2的运行时间: gcc-5.4-氧气测试。c-氧气测试1 及 gcc-5.4-福托股份有限公司12月 -农场计数注册 -fc

它说,从

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

-fthread跳转 -falign功能-falign跳跃 -falign循环-falign标签 -fcaller保存 -跳高 -fcse跟随跳跃等

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

但是,我比较了通过以下方式获得的可执行文件test1和test2的运行时间:

gcc-5.4-氧气测试。c-氧气测试1

gcc-5.4-福托股份有限公司12月 -农场计数注册 -fcombine堆栈调整 -FCompareElim-fthread jumps-falling函数…(所有83个标志)test.c-o test2

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

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


我一定是误解了什么,但我还找不到任何解释。我非常感谢你的帮助。非常感谢。

这是一个常见的问题。为了启用(或禁用)特定优化,您必须首先启用优化器,即使用
-O..
标志之一,除了
-O0
(或仅
-O
,相当于
-O1
).

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

plus“其次,-Ox标志支持许多不受任何单个-f*选项控制的优化。”来自Marc Glisse提供的链接