Java JIT循环展开策略?

时间:2011-08-30 12:35:42

标签: java optimization compiler-construction jit loop-unrolling

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是否真的展开循环,如果没有,那么为什么。

2 个答案:

答案 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

此标志将

  

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

这将直接解决您的问题,而无需查看生成的程序集