在海湾合作委员会编制:-O3有害吗?

时间:2014-08-08 07:21:24

标签: gcc optimization

我听说不应该用gcc编译-O3选项。真的吗?如果是这样,避免-O3的原因是什么?

1 个答案:

答案 0 :(得分:6)

答案是:这取决于你的代码。

基本的经验法则是:

  • 在-O1,编译器会进行不需要太长时间计算的优化。

  • 在-O2,编译器执行“昂贵”的优化,这可能会减慢编译过程。它们也可能使输出程序更大,但可能没那么多。

  • -Os与-O2大致相同,但优化调整的大小比速度更大。在大多数情况下,这两个功能不会发生冲突(更优化的代码执行的步骤更少,因此更小),但有一些技巧可以重复代码以避免分支处罚,例如。

  • 在-O3,编译器真正开始了空间需求的优化。它将更加积极地内联函数,并尝试尽可能使用矢量化。

您可以在GCC documentation中阅读更多详情。如果你真的想要超级优化你的代码,那么你可以尝试启用更多的选项,即使在-O3也没有使用; -floop-*选项,例如`。

速度空间优化的问题尤其在于它们会对内存缓存的有效性产生负面影响。代码可能对CPU更好,但如果它对你的内存不是更好,那么你输了。出于这个原因,如果你的程序没有一个热点,它花费了所有的时间,那么你可能会发现它总体上变慢了。

现实世界的优化是一项不精确的科学,原因有三:

  1. 用户的硬件差异很大。

  2. 对一个代码库有利的可能对另一个代码库不利。

  3. 我们希望编译器能够快速运行,因此必须做出最佳猜测,而不是尝试所有选项并选择最佳选择。

  4. 基本上,答案始终是,如果性能很重要尝试所有优化级别,请衡量您的代码的效果,并为您选择最适合的。并且每次发生重大变化时都会这样做。

    如果表现无关紧要,-O2就是你的选择。