【发布时间】:2023-03-14 02:52:01
【问题描述】:
基于对this 问题的回答的讨论,我发现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没有在循环中修改。
现在我注意到,只需将 x 从 0.5 更改为 1.0 即可禁用此优化。进一步的测试表明,仅当 abs(x)
编辑:优化似乎在hotspot/src/share/vm/opto/subnode.cpp中实现
【问题讨论】:
-
你怎么知道“表达式 Math.sin(x) 不会为每次迭代计算”?你看过汇编代码吗?还是测量时间?另请注意,
Math.sin是 Java 1.7(可能之前)中的内部方法,因此运行的代码不是 JDK 源代码中显示的 Java 代码... -
@assylias:通过测量时间,但你有一个很好的观点。我想知道它是否是 Math.sin 的实际实现,它针对 arguments
-
@jarbjo x86_64 cpus 的实现在这里:hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/6e9aa487055f/src/… 在第 2878 行附近。
标签: java jvm-hotspot optimization