在GCC中编译-O3有害吗?

在GCC中编译-O3有害吗?,gcc,optimization,Gcc,Optimization,我听说不应该用gcc编译-O3选项。这是真的吗?如果是这样,那么避免使用-O3的原因是什么?答案是:这取决于您的代码 基本经验法则如下: 在-O1,编译器进行优化,计算时间不会太长 在-O2时,编译器会进行“昂贵的”优化,这可能会减慢编译过程。它们也可能使输出程序稍微大一点,但可能不会太大 -Os与-O2大致相同,但优化更多地是针对大小而不是速度进行的。在大多数情况下,这两个特性并不冲突(更优化的代码执行的步骤更少,因此更小),但有一些技巧可以复制代码以避免分支惩罚,例如 在-O3,编译器真的

我听说不应该用gcc编译-O3选项。这是真的吗?如果是这样,那么避免使用-O3的原因是什么?答案是:这取决于您的代码

基本经验法则如下:

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

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

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

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

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

特别是速度空间优化的问题是,它们可能会对内存缓存的有效性产生负面影响。代码可能对CPU更有利,但如果对内存没有好处,则会丢失代码。出于这个原因,如果你的程序没有一个单独的热点,它花费了所有的时间,那么你可能会发现它总体上是慢下来的

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

  • 用户的硬件变化很大

  • 对一个代码库有利的内容可能对另一个代码库不利

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

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


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

    这并不是真的有害,但它可能不会让您的代码更快。有时最好使用
    -O2
    ,并可能从
    -O3
    中添加一些单独的优化。从哪里来?那个人提供了支持他/她的建议的任何论据吗?@Michael,那个人没有提供任何论据。如果是这样,我就不用问了。可能是@Michael It的复制品。为什么我在搜索时没有发现这个问题?传递
    -mtune=native
    (使用
    -O2
    -O3
    )可能很有用,尽管并非所有体系结构都支持该选项。@ams(我想你不是ams)优化是一门精确的科学:问题是“给定函数f(x)”公式化的,找到x_0,这样对于所有x f(x_0)@user877329,我添加了“真实世界”“现在。这样更好吗?一般来说,除了最基本的程序外,并非所有程序都可以实现完美的优化。这是一个无法解决的问题,即使条件已知,目标明确。我还没有从数学上证明这一点,但我不想等待计算机来尝试它。@ams是的,正如在对优化问题进行措辞后所指出的那样,我列出了使生活变得困难的各种事情。