HotSpot可以优化掉纯方法的冗余调用而无需内联它们吗?

Bee*_*ope 7 java jvm-hotspot compiler-optimization

纯方法是没有副作用的方法:它们唯一的作用是返回一个值,该值是它们的参数的函数.

使用相同参数对同一个纯方法的两次调用将返回相同的值.因此,如果对具有相同参数的纯方法进行两次调用,HotSpot可以优化第二次调用,只需重新使用第一次调用的值吗?

例如:

int add(int x, int y) {
  return x + y;
}

int addTwice(int x, int y) {
  return add(x, y) + add(x, y);
}
Run Code Online (Sandbox Code Playgroud)

如果热点不内联addaddTwice它理解add纯粹的,因此呼吁add只有一次,双倍返还价值?

当然,这样一个微不足道的[mcve]不太可能是直接感兴趣的,但是由于内联,不同的控制流,自动生成的代码等,在实践中可能会发生类似的情况.

apa*_*gin 6

到目前为止,HotSpot无法做到这一点.

如果没有内联,则JIT编译器的方法调用通常是不透明的.很难进行跨方法优化.其中一个原因是方法入口点是易失性的,即它可以在运行时由于JIT编译,重新编译,去优化,JVMTI调用等而同时更改.当HotSpot进行显式方法调用时,它不知道目标方法是否被解释或编译,它是否收集JIT统计信息,是否正在调试,是否在内部有断点,或者是否启用了JVMTI方法事件.

另一方面,即使存在这样的优化,也不会太有用.纯粹的方法在他们能做的事情上非常有限,因此它们通常简短而且有很多机会被内联.在内联之后,JIT可以更容易地在同一编译范围内进行优化.