热点循环条件优化器的奇怪行为
基于围绕这个问题的答案的讨论,我发现了Java Hotspot优化器的一个非常奇怪的行为。观察到的行为至少在Oracle VM 1.7.0_17中可以看到,但在较旧的Java 6版本中似乎也会发生。
首先,我已经意识到优化器显然知道标准API中的某些方法是不变的并且没有副作用。在执行类似 的循环时,不会为每次迭代计算表达式,但优化程序知道该方法没有相关的副作用,并且只要不在循环中修改,结果就是不变的。double x=0.5; for(double d = 0; d < Math.sin(x); d += 0.001);
Math.sin(x)
Math.sin
x
现在我注意到,简单地从0.5更改为1.0就禁用了这种优化。进一步的测试表明,仅当 abs(x) < asin(1/sqrt(2)) 时,才会启用优化。有没有一个很好的理由,我没有看到,或者这是对优化条件的不必要的限制?x
编辑:优化似乎是在 hotspot/src/share/vm/opto/subnode 中实现的.cpp