考虑以下循环:
while((expressionA) & (expressionB)){
// do something
}
while((expressionA) && (expressionB)){
// do something
}
其中expressionA
和expressionB
是bool
类型的表达式,而expressionB
没有副作用。在这些情况下,这两个案例 as-if - 等价(对吧?)。
从源代码中天真地获取其提示的(假设的)编译器会在&&
版本中放置一个分支,我们最终会paying for branch prediction failures。
使用现代编译器(例如当前的GCC),&
版本是否可以在&&
版本上获得显着的性能提升?
我的猜测是否定的,因为:
expressionB
足够便宜,编译器会认识到这一点并避免创建短路分支。expressionB
足够昂贵,编译器会产生短路,因为:
expressionA
的概率不接近1.0,我们可以从短路中获得可观的平均性能增益。expressionA
的概率接近1.0,我们不会付出太多,因为分支预测会趋于成功。