GCC精心挑选的优化

GCC handpicking Optimizations

本文关键字:优化 挑选 GCC      更新时间:2023-10-16

我看到这个线程,我也有同样的问题,但这个问题没有得到真正的回答:GCC标准优化行为

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

我如何为g++手工选择优化,或者这是不可能的?

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

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

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

尽管如此,你可能还是没有更好的运气了。可能是多个优化组合在一起提高了您的性能。它也可能是任何特定标志未涵盖的优化的结果。

我还怀疑,更好的缓存位置是否会带来"难以置信的性能提升"。如果是这样的话,那很可能是巧合,尤其是在-O1。性能的大幅提高通常是因为GCC能够消除代码的一大块,要么是因为它实际上没有任何净效果,要么总是导致计算出相同的值,要么是它调用了未定义的行为。