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 是否确实展开了循环,如果没有,那么为什么。
IfJVM展开循环可能最好的答案是实际上打印生成的程序集。请注意,这要求您的代码实际上作为热点执行(即 JVM 认为它值得进行昂贵的优化)。
WhyJVM 以某种方式做出决定是一个更难的问题,可能需要深入分析 JIT 代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)