循环特殊情况的java处理
爪哇,C或C++,假设我们有一个非常常见的情况,我们需要迭代大量的时间并执行函数DOX,但是在迭代的一个过程中,我们应该执行函数DOY。p>
int index = 123456;
for(int i = 0; i < 1000000; i++)
{
if(i == index) doY();
else doX();
}
在我看到一个真正的性能问题的情况下,我通常会将循环分成两部分,但这可能会非常痛苦,尤其是如果循环的主体很大的话。编译后的代码真的会在每次迭代时检查条件吗,还是可以由编译器进行优化?此外,如果index
在编译时不是一个常数,那么会有这样的优化吗
# 1 楼答案
这通常不会造成巨大的性能问题。这是由于branch predicting。请参阅此famous question
分支预测基本上是程序集猜测if语句的计算方式。如果猜对了,几乎不需要时间。如果它猜错了,它将回溯并导致性能问题。分支预测器通常会使用它以前的分支路由作为下一个分支的“猜测”
因为你的if语句的计算结果几乎是错误的。分支预测器几乎每次都能正确预测
所以要回答你的问题“编译后的代码真的在每次迭代中检查条件吗?”不,它不。虽然它不是由编译器优化的,而是由汇编管道本身优化的