关于编译器 (GCC) 所做的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最佳的?
最佳答案
通常 -O2 是一个很好的优化级别,可以先尝试。
但是,如果您希望获得最佳结果,您最终将尝试许多优化级别,因为您无法事先确定哪个级别最适合您的应用程序。
另请注意,优化结果应因每个 CPU 的不同而不同(在某些 CPU 上,优化大小实际上可能比优化速度产生更好的速度)。
仅供将来引用,这里是每个级别的简要说明(您可以在文档 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 中找到完整的说明):
-O(与 -O1 相同):
使用 -O,编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。
-O2:进一步优化。 GCC 执行几乎所有不涉及空间速度权衡的受支持优化。与 -O 相比,此选项会增加编译时间和生成代码的性能。
-O3:优化更多。 -O3 打开 -O2 指定的所有优化,并打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize、-ftree-partial-pre 和 - fipa-cp-clone 选项。
-Os:优化大小。 -Os 启用所有通常不会增加代码大小的 -O2 优化。它还执行旨在减少代码大小的进一步优化。
-Ofast:无视严格的标准合规性。 -Ofast 启用所有 -O3 优化。它还支持对所有符合标准的程序无效的优化。它打开 -ffast-math 和 Fortran 特定的 -fno-protect-parens 和 -fstack-arrays。
如果您使用多个 -O 选项,无论是否有级别编号,最后一个这样的选项是有效的。
关于gcc - 我应该优化多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924513/