有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

循环特殊情况的java处理

爪哇,C或C++,假设我们有一个非常常见的情况,我们需要迭代大量的时间并执行函数DOX,但是在迭代的一个过程中,我们应该执行函数DOY。p>

int index = 123456;
for(int i = 0; i < 1000000; i++)
{
    if(i == index) doY();
    else doX();
}

在我看到一个真正的性能问题的情况下,我通常会将循环分成两部分,但这可能会非常痛苦,尤其是如果循环的主体很大的话。编译后的代码真的会在每次迭代时检查条件吗,还是可以由编译器进行优化?此外,如果index在编译时不是一个常数,那么会有这样的优化吗


共 (1) 个答案

  1. # 1 楼答案

    这通常不会造成巨大的性能问题。这是由于branch predicting。请参阅此famous question

    分支预测基本上是程序集猜测if语句的计算方式。如果猜对了,几乎不需要时间。如果它猜错了,它将回溯并导致性能问题。分支预测器通常会使用它以前的分支路由作为下一个分支的“猜测”

    因为你的if语句的计算结果几乎是错误的。分支预测器几乎每次都能正确预测

    所以要回答你的问题“编译后的代码真的在每次迭代中检查条件吗?”不,它不。虽然它不是由编译器优化的,而是由汇编管道本身优化的