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]可能不是直接感兴趣的,但是由于内联,不同的控制流,自动生成的代码等,在实践中可能会发生类似的情况。
答案 0 :(得分:6)
如果没有内联,则JIT编译器的方法调用通常是不透明的。很难进行跨方法优化。其中一个原因是方法入口点是易失性的,即由于JIT编译,重新编译,去优化,JVMTI调用等原因,它可以在运行时同时更改。当HotSpot进行显式方法调用时,它不知道目标方法是否被解释或编译,它是否收集JIT统计信息,是否正在调试,是否在内部有断点,或者是否启用了JVMTI方法事件。
另一方面,即使存在这样的优化,也不会太有用。纯粹的方法在他们能做的事情上非常有限,因此它们通常简短而且有很多机会被内联。在内联后,JIT在同一编译范围内进行优化要容易得多。