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

Mus*_*ful 6 c++ performance short-circuiting compiler-optimization branch-prediction

考虑以下循环:

while((expressionA) & (expressionB)){
    // do something
}
Run Code Online (Sandbox Code Playgroud)
while((expressionA) && (expressionB)){
    // do something
}
Run Code Online (Sandbox Code Playgroud)

其中expressionAexpressionB是类型的表达boolexpressionB不具有副作用.在这些条件下,这两种情况都是为-如果换算后(右?).

一个(假设的)编译器天真地从源代码中获取其提示将在&&版本中放置一个分支,我们最终将支付分支预测失败.

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


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

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