逻辑运算符和分支预测失败

时间:2015-12-03 08:00:56

标签: c++ performance compiler-optimization short-circuiting branch-prediction

考虑以下循环:

while((expressionA) & (expressionB)){
    // do something
}
 
while((expressionA) && (expressionB)){
    // do something
}

其中expressionAexpressionBbool类型的表达式,而expressionB没有副作用。在这些情况下,这两个案例 as-if - 等价(对吧?)。

从源代码中天真地获取其提示的(假设的)编译器会在&&版本中放置一个分支,我们最终会paying for branch prediction failures

使用现代编译器(例如当前的GCC),&版本是否可以在&&版本上获得显着的性能提升?

我的猜测是否定的,因为:

  • 如果expressionB足够便宜,编译器会认识到这一点并避免创建短路分支。
  • 如果expressionB足够昂贵,编译器会产生短路,因为:
    • 如果expressionA的概率不接近1.0,我们可以从短路中获得可观的平均性能增益。
    • 如果expressionA的概率接近1.0,我们不会付出太多,因为分支预测会趋于成功。

0 个答案:

没有答案