【问题标题】:Is the if-statement with a const condition optimized inside a for loop (c++)是否在 for 循环内优化了具有 const 条件的 if 语句 (c++)
【发布时间】:2020-11-19 23:34:43
【问题描述】:

考虑以下代码:

void func(int a, size_t n)
{
  const bool cond = (a==2);
  if (cond){
    for (size_t i=0; i<n; i++){
      // do something small 1
      // continue by doing something else.
    }
  } else {
    for (size_t i=0; i<n; i++){
      // do something small 2
      // continue by doing something else.
    }
  }
}

在这段代码中,// continue by doing something else.(可能是很大一部分,由于某种原因不能分成一个函数)完全相同地重复。为了避免这种重复,可以这样写:

void func(int a, size_t n)
{
  const bool cond = (a==2);
  for (size_t i=0; i<n; i++){
    if (cond){
      // do something small 1
    } else {
      // do something small 2
    }
    // continue by doing something else.
  }
}

现在我们在一个(假设是非常大的)for 循环中有一个 if 语句。但是 if 语句 (cond) 的条件是 const 并且不会改变。编译器会以某种方式优化代码(比如将其更改为初始实现)吗?有小费吗?谢谢。

【问题讨论】:

  • 只看编译器生成的程序集。
  • 在这种情况下,现代编译器应该能够对其进行优化。但根据您在内容中调用的方法,可能会认为它毫无意义。在更复杂的情况下,bool 可以在 for 循环期间修改(从编译器的角度来看),那么它将无法执行这样的优化。话虽如此,分支预测器确保它并不重要。
  • 第一个代码错过了}

标签: c++ performance if-statement optimization compiler-optimization


【解决方案1】:

细节很重要,但您包含的内容太少。当您要求编译器优化时,您需要知道编译器将根据 as-if-rule 进行优化。粗略地说,编译器可以做任何优化,只要它们不改变可观察的行为(很少有例外)。您的两个函数的可观察行为都为零,因此在开启优化的情况下,gcc -O3,这就是编译器对它们所做的:

func(int, unsigned long):
        ret
func2(int, unsigned long):
        ret

推测编译器对您的代码做了什么是徒劳的。不要推测,而是看输出。你可以在这里:https://godbolt.org/z/oznWz6

PS:我不应该忘记包括的一些口头禅:

不要进行过早的优化。代码应该主要是为人类阅读而编写的。只有当您进行概要分析并有证据表明您可以通过改进该功能获得某些东西时,您才可以考虑以性能换取可读性。

另外不要忘记,您编写的代码不是针对您的 CPU 的指令。您的代码是对最终程序应该做什么的抽象描述。编译器非常清楚如何重新排列代码以充分利用 CPU。通常,它在这方面比人类可能要好得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多