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

问题描述 投票:7回答:1

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 compiler-optimization jvm-hotspot
1个回答
6
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.