【发布时间】:2018-06-11 08:13:37
【问题描述】:
Pure methods 是那些没有副作用的:它们唯一的作用是返回一个作为其参数函数的值。
使用相同参数两次调用相同的纯方法将返回相同的值。那么,给定对具有相同参数的纯方法的两次调用,HotSpot 是否可以优化第二次调用,只需重新使用第一次调用的值?
例如:
int add(int x, int y) {
return x + y;
}
int addTwice(int x, int y) {
return add(x, y) + add(x, y);
}
如果 HotSpot 没有将 add 内联到 addTwice 中,它是否理解 add 是纯 并因此只调用一次 add 并将返回值加倍?
当然,这种微不足道的 [mcve] 不太可能引起直接兴趣,但由于内联、不同的控制流、自动生成的代码等,在实践中可能会发生类似的情况。
【问题讨论】:
-
Java HotSpot Performance Engine Architecture 似乎没有提到纯方法检测。如果存在,我希望这样的功能会被突出显示。
-
@JimGarrison - 是的,尽管公平地说,这是一个非常高级的概述,只明确提到了五种重要技术。即使确实存在纯方法检测,我认为这将是从被包含在这样的列表中删除的几个级别的模糊(尽管他们提到的快速“instanceof”东西非常模糊)。 Here's a somewhat dated but more comprehensive list 也没有提到纯方法检测。
-
考虑到纯方法结果缓存的优化潜力,如果没有提到它,我会感到惊讶:-)
-
Hiotspot 可以做任何在 JLS 和 JVM 规范规则下无法观察到的事情。
-
@Quonux - 当然,但 JIT 也可以使用更宽松的纯定义:如果当前编译的版本是纯的,它可以考虑一个函数条件纯,考虑不常见陷阱是纯的,即使整个函数不是纯的。例如,如果一个函数包含编译前在实践中从未观察到的不纯行为(例如,登录错误处理路径),JIT 通常会选择根本不编译未采用的分支,而只是插入一个不常见的陷阱覆盖这种情况,如果它会强制重新编译函数。
标签: java compiler-optimization jvm-hotspot