JIT的循环展开政策是什么?或者,如果没有简单的答案,那么有什么办法可以检查循环中循环展开的位置/时间?
GNode child = null;
for(int i=0;i<8;i++){
child = octree.getNeighbor(nn, i, MethodFlag.NONE);
if(child==null)
break;
RecurseForce(leaf, child, dsq, epssq);
}
基本上,我有一段代码具有静态迭代次数(八次),当我离开for循环时它会很糟糕。但是当我手动展开循环时,它确实更好。我有兴趣找出JIT是否真的展开循环,如果没有,那么为什么。
答案 0 :(得分:6)
如果 JVM展开循环,实际上printing the generated assembly可能是最好的答案。请注意,这需要您的代码实际作为热点执行(即JVM认为它值得进行昂贵的优化)。
为什么 JVM决定这种或那种方式是一个更难的问题,可能需要对JIT代码进行深入分析。
答案 1 :(得分:0)
查看循环中是否正在执行循环展开的另一种方法是在运行代码时将-XX:LoopUnrollLimit=1
指定为argument to the JVM。
如果您有一个可执行jar,则如何使用它的示例如下:
java -XX:LoopUnrollLimit=1 -jar your-jar.jar
此标志将
带有服务器编译器中间表示节点的展开循环主体的计数小于此值
这将直接解决您的问题,而无需查看生成的程序集