c++ - if 语句位于循环内,反之亦然

标签 c++ c performance

我想知道哪个更有效率。

假设我有这段代码:

while (i<10000){
   if (cond1)
      doSomething1();
   else if (cond2)
      doSomething2();
   else
      doSomething3();
}

现在 cond1cond2 是“常量”条件,这意味着如果 i 发生一次,那么所有的条件都会发生,并且只有其中之一可能是真的。 大多数时候,最后一个 doSomething3() 会被执行。

现在如果我写这样的东西会发生什么:

if (cond1){
   while (i<10000)
      doSomething1();
}
else if (cond2){
   while (i<10000)
      doSomething2();
}
else{
   while (i<10000)
      doSomething3();
}

因为我只检查 cond1cond2 一次,所以效率更高吗?

最佳答案

您需要问的是哪个缓存效率更高。

在许多情况下,编译器可以为您和 will rearrange your code to get the best results 解决这个问题。其执行此操作的能力很大程度上取决于 doSomethingN 的作用以及 condN 的含义。如果 condN 可以随着时间的推移而改变,那么它很可能每次都需要进行物理检查,在这种情况下,您的代码无法实质上重新安排,并且在每次循环迭代时检查它确实可能会慢得多。但是,如果 condN 是常量,则可以优化重复的检查,本质上导致您的第一个代码被转换为第二个代码。

最终,唯一确定的方法是测量它(如果您能理解的话,请研究生成的组件)。

关于c++ - if 语句位于循环内,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330701/

相关文章:

c# - 如何阻止 EF 生成无用代码,这有关系吗?

java - 在 Java 中用原语规避代码膨胀的模式

c++ - n 值 UUID 生成器,可重用 ID

c++ - 在 C++ 类中的何处声明 struct 和 typedef

c++ - 如何在运行时以 DAG 的形式组合多个函数

c - 从线程返回参数(结构)

c - 在C中删除字符串中的点

c++ - 在第二种情况下为我的命名空间和函数指定声明是如何正确的?

c - 当描述符重叠时,C11 数组初始化的行为是什么?

c++ - 运算符链接,为什么要增长左分支?