循环/范围中的c ++条件优化

时间:2017-11-09 20:36:56

标签: c++ optimization

如果我必须检查两个(或更多)条件中的一个来执行循环中的其余范围,例如,哪些代码最好?

while(condition){
  if(some_condition_1 || some_condition_2){
    continue;
  }

  // ... do stuff
}

如果我们知道some_condition_1与some_condition_2相比更经常是真的,那么将下面的条件分开有助于优化代码吗?

while(condition){
  if(some_condition_1){
    continue;
  }
  if(some_condition_2){
    continue;
  }


  // do stuff
}

因为如果some_condition_1为真,则不必在第二种情况下检查some_condition_2

1 个答案:

答案 0 :(得分:0)

编写最容易阅读的内容,并进行优化编译。

话虽如此,在这种情况下,短路评估意味着您的第一个选择是严格更好的。让我们看看为什么:

假设编译器非常愚蠢(没有优化)。 (我已经删除了你的继续,因为它们也会导致分支,但这个想法是一样的。)

while(condition){
  if(some_condition_1 || some_condition_2){
    do_stuff();
  }

  do_different_stuff();
}

这将产生1个分支指令:在if语句中,根据比较的值,指令指针可以跳过包含do_stuff()continue的块到紧接着的点它(在这种情况下,do_different_stuff())。根据体系结构,优化和代码的详细信息,可能会为some_condition_1 || some_condition_2的短路行为生成额外的分支。

这个版本怎么样?

while(condition){
  if(some_condition_1){
    do_stuff();
    continue;
  }
  if(some_condition_2){
    do_stuff();
    continue;
  }
  do_different_stuff();
}

好吧,首先我们点击if(some_condition1),程序将“分支” - 有条件地跳转到if(some_condition2)。在这里,程序将再次分支 ,有条件地跳转到do_different_stuff()。这是两个保证分支!所以第一个选择更好。