GCC精选优化

时间:2016-04-15 20:42:56

标签: c++ gcc

我看到了这个帖子,我有同样的问题,但这个问题并没有得到真正回答:GCC standard optimizations behavior

我试图弄清楚在O1中究竟是什么旗帜引起了令人难以置信的性能提升。我首先找到了使用g++ -O1 -Q --help=optimizers设置的标志,然后获取每个启用的标志并使用它们用g ++进行编译。但输出结果不同(二进制本身具有不同的大小)。

如何为g ++精选优化或者这是不可能的?

1 个答案:

答案 0 :(得分:3)

并非所有优化都有单独的标记,因此它们的组合不会生成与使用-O1或任何其他常规优化启用选项(-Os-O2等相同的代码...)。另外,我想当你使用-O0(默认值)时会忽略很多特定的优化选项,因为如果通常没有启用优化,它们需要跳过的传递。

要尝试缩小性能提升范围,可以尝试使用-O1,然后有选择地禁用优化。例如:

g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ...

尽管如此,你仍然可能没有更好的运气。可能是多个优化组合正在产生性能提升。它也可能是任何特定标志未涵盖的优化结果。

我还怀疑更好的缓存局部性导致了“令人难以置信的性能提升”。如果是这样,那可能是巧合,特别是在-O1。通常会出现大的性能提升,因为GCC能够消除一大块代码,因为它实际上没有任何净效果,总是导致计算相同的值或者调用未定义的行为。