答案是:这取决于你的代码.
基本的经验法则是这样的:
在-O1,编译器执行不需要太长时间计算的优化.
在-O2,编译器执行"昂贵"的优化,这可能会减慢编译过程.它们也可能使输出程序更大,但可能不是那么多.
-Os与-O2大致相同,但优化调整的大小比速度更大.在大多数情况下,这两个特性不会发生冲突(更优化的代码执行的步骤更少,因此更小),但是有一些技巧可以重复代码以避免分支处罚.
在-O3,编译器真正开始了空间需求的优化.它将更加积极地内联函数,并尝试尽可能使用矢量化.
您可以在GCC文档中阅读更多详细信息.如果你真的想要超级优化你的代码,那么你可以尝试启用更多的选项,即使在-O3也没有使用; 该-floop-*选项,instance`.
特别是速度空间优化的问题在于它们会对内存缓存的有效性产生负面影响.代码可能对CPU更好,但如果它对你的记忆不是更好,那么你输了.出于这个原因,如果你的程序没有一个热点,它花费了所有的时间,那么你可能会发现它总体上放慢了速度.
现实世界的优化是一项不精确的科学,原因有三:
用户的硬件差异很大.
一个代码库的好处可能对另一个代码库不利.
我们希望编译器能够快速运行,因此必须做出最好的猜测,而不是尝试所有选项并选择最佳选项.
基本上,答案永远是,如果性能问题尝试所有的优化级别,衡量如何好你的代码执行,并为您选择最好的一个.每次发生重大变化时,请再次这样做.
如果性能无关紧要,-O2是你的选择.