我应该总是使用gcc编译发布版本时指定-O3
标志,或者是否有任何其他可能的缺点?
在使用gcc编译发布版本时,我应该总是指定-O3标志吗?
没有,或者至少可能没有。对于性能;有时-O3
生成的代码比-O2
生成的代码慢。
Under the hood;它实际上是一堆不同的优化,可以单独启用/禁用;其中-O3
(以及-O2
和-Os
)只是启用一组许多优化的方便简写。-O2
应该代表"启用所有总是有用的优化",而-O3
应该代表"启用所有经常有用(但可能使事情变得更糟)的优化"。对于每个-O
设置,哪些实际优化是启用的/没有启用的,详细信息请参见手册(在https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。
如果你不使用快捷方式,并指定个人优化自己;然后(经过艰苦的"试错");方法和对每种情况的结果进行基准测试),您可以找到一组始终有助于您的程序的优化(并避免启用使程序性能变差的优化)。
一个更实际的方法是从O2
开始,然后确定哪些-O2
尚未启用的优化也有帮助。
然而;性能并不是唯一重要的事情。节省时间;大多数人只是尝试-O2
或-O3
,然后选择最快的。部分原因是你的软件和编译器是不断变化的;所以任何"费力的基准测试"你做的事需要定期再做一遍。
注意:为了真正获得最大的性能,每个翻译单元可以用不同的优化设置进行编译(这样你就可以做"费力的试错";对于每个单独的源文件);然后得到的结果集"经过了不同的优化"可以将目标文件输入到链接时间优化器中以优化更多。