【问题标题】:Compiling in GCC: Is -O3 harmful?在 GCC 中编译:-O3 有害吗?
【发布时间】:2014-10-01 14:38:20
【问题描述】:

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

【问题讨论】:

  • 这并不是真正的harmfull,但它可能不会让您的代码更快。有时最好使用-O2,并可能从-O3 中添加一些单独的优化。
  • “我听说过”。从哪里?该人是否提供了任何支持他/她建议的论据?
  • @Michael,此人未提供论据。如果是这样,我就不必问了。
  • @Michael 是的。为什么我搜索的时候没有找到这个问题?

标签: gcc optimization


【解决方案1】:

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

基本的经验法则是这样的:

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

  • 在 -O2 时,编译器会进行“昂贵的”优化,这可能会减慢编译过程。它们也可能使输出程序更大一些,但可能不会太大。

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

  • 在 -O3 处,编译器确实启动了需要空间的优化。它将更积极地内联函数,并尽可能使用矢量化。

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

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

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

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

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

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

基本上,如果性能很重要,答案总是尝试所有优化级别,衡量您的代码的执行情况,然后选择最适合您的。每当发生重大变化时,再次执行此操作。

如果性能不重要,-O2 是您的选择。

【讨论】:

  • 传递-mtune=native (使用-O2-O3)可能会有用
  • 好点,尽管并非所有架构都支持该选项。
  • @ams(我猜你不是 AMS)优化一门精确的科学:问题被表述为“给定函数 f(x),找到 x_0 使得对于所有 xf (x_0)
  • @user877329 我现在添加了“真实世界”。那个更好吗?一般来说,除了最基本的程序之外,并非所有程序都可以实现完美优化。这是一个无法解决的问题,即使条件已知且目标明确。我还没有在数学上证明这一点,但我不想等待计算机来尝试。
  • @ams 是的,正如在优化问题的表述后指出的那样,我列出了各种让生活变得困难的事情。
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2014-03-06
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多