我正在浏览一个文档,该文档讨论Java的just-in-time compiler(JIT)优化技术。其中之一是“循环反转”。文件说:
循环反转如何工作以及如何优化我们的代码路径?
N.B .: 如果有人可以用一个Java代码示例进行解释,以及JIT如何将其优化为本地代码,以及为什么它在现代处理器中是最佳的,那就太好了。
最佳答案
while (condition) {
...
}
工作流程:if (condition) do {
...
} while (condition);
工作流程:比较这两者,您可以很容易地看到,如果循环中只有一个步骤,则后者可能根本不执行任何跳转,并且通常跳转的次数比迭代的次数少一个。前者将不得不跳回检查条件,仅当条件为假时才跳出循环。
现代流水线CPU架构上的跳转可能会非常昂贵:随着CPU在跳转之前完成检查的执行,该跳转之外的指令已经在流水线的中间。如果分支预测失败,则必须放弃所有此处理。在重新启动管道时,进一步执行被延迟。
解释上述分支预测:对于每种条件跳转,CPU都有两条指令,每条指令都押注结果。例如,您将在循环的末尾放置一条指令,说“如果不为零,则跳为零”,因为必须在除最后一次迭代之外的所有迭代中进行跳转。这样,CPU开始使用跳转目标后面的指令而不是跳转目标本身的指令来泵送其管道。
重要的提示
请不要以此为例说明如何在源代码级别进行优化。这已经完全被误导了,因为从您的问题中已经很清楚地看到,从第一种形式到第二种形式的转换是JIT编译器作为例程完全由自己完成的事情。