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);
}
基本上,我上面有一段代码,它有一个静态的迭代次数(8),当我离开for循环时,它会变坏。但是当我手动展开循环时,它的表现明显更好。我很想知道JIT是否真的展开了循环,如果没有,那么原因是什么。
如果 JVM展开循环,最好的回答可能是实际打印生成的程序集。请注意,这需要您的代码实际上作为热点执行(即JVM认为它值得进行昂贵的优化)。
为什么 JVM决定这种或那种方式是一个更难的问题,可能需要深入分析JIT代码。
查看是否在循环中执行循环展开的另一种方法是在运行代码时将-XX:LoopUnrollLimit=1
指定为JVM的参数。
如果你有一个可执行的jar文件,那么你可以这样使用:
java -XX:LoopUnrollLimit=1 -jar your-jar.jar
这个标志将
展开服务器编译器中间表示节点计数小于此值的循环体
这将直接解决你的问题而不需要查看生成的程序集