我看到了这个帖子,我有同样的问题,但这个问题并没有得到真正回答:GCC standard optimizations behavior
我试图弄清楚在O1中究竟是什么旗帜引起了令人难以置信的性能提升。我首先找到了使用g++ -O1 -Q --help=optimizers
设置的标志,然后获取每个启用的标志并使用它们用g ++进行编译。但输出结果不同(二进制本身具有不同的大小)。
如何为g ++精选优化或者这是不可能的?
答案 0 :(得分:3)
并非所有优化都有单独的标记,因此它们的组合不会生成与使用-O1
或任何其他常规优化启用选项(-Os
,-O2
等相同的代码...)。另外,我想当你使用-O0
(默认值)时会忽略很多特定的优化选项,因为如果通常没有启用优化,它们需要跳过的传递。
要尝试缩小性能提升范围,可以尝试使用-O1
,然后有选择地禁用优化。例如:
g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ...
尽管如此,你仍然可能没有更好的运气。可能是多个优化组合正在产生性能提升。它也可能是任何特定标志未涵盖的优化结果。
我还怀疑更好的缓存局部性导致了“令人难以置信的性能提升”。如果是这样,那可能是巧合,特别是在-O1
。通常会出现大的性能提升,因为GCC能够消除一大块代码,因为它实际上没有任何净效果,总是导致计算相同的值或者调用未定义的行为。