【问题标题】:c++ condition optimization in a loop/scope [duplicate]循环/范围中的c ++条件优化[重复]
【发布时间】:2017-11-10 04:57:56
【问题描述】:

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

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

【问题讨论】:

  • 对于逻辑 AND 和 OR 运算符,C++ 使用short-circuit evaluation
  • 写出可读和明确的代码,让编译器完成它的工作,它通常比你做得更好
  • Since that if some_condition_1 is true, it won't have to check for some_condition_2 in the second case 这两种情况都是如此。
  • 还有一个一般提示:不要在编写程序的早期担心优化问题。专注于制作简单、可读、可维护的代码。这样可行。然后,如果需要特定性能、度量、基准和配置文件以找到瓶颈,并采取最差的一个并优化它(记住记录和评论你在做什么以及为什么)。然后根据需要进行迭代以满足要求。并确保程序在每次迭代之间通过所有测试。
  • 抱歉我之前的误导性评论。它不是编译器优化;这是标准规定的。

标签: c++ optimization


【解决方案1】:

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

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

假设编译器很笨(没有优化)。 (我已经删除了你的 continue,因为它们也会导致分支,但想法是一样的。)

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()。这是两个保证分支!所以第一个选项更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多