9

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

4

2 回答 2

6

如果JVM 展开循环,最好通过实际打印生成的程序集来回答。请注意,这需要您的代码实际作为热点执行(即 JVM 认为它值得进行昂贵的优化)。

为什么JVM 会做出这样或那样的决定是一个更难的问题,并且可能需要对 JIT 代码进行深入分析。

于 2011-08-30T12:38:49.577 回答
1

查看是否在循环中执行循环展开的另一种方法是在运行代码时将其指定-XX:LoopUnrollLimit=1JVM 的参数。

如果您有一个可执行的 jar,那么如何使用它的一个示例是:

java -XX:LoopUnrollLimit=1 -jar your-jar.jar

这面旗帜将

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

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

于 2018-08-22T12:42:49.153 回答