Java JIT循环展开策略



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

这个标志将

展开服务器编译器中间表示节点计数小于此值的循环体

这将直接解决你的问题而不需要查看生成的程序集

最新更新