代码之家  ›  专栏  ›  技术社区  ›  BeeOnRope

HotSpot是否可以优化对纯方法的冗余调用而不内联它们?

  •  8
  • BeeOnRope  · 技术社区  · 7 年前

    Pure methods 是没有副作用的:它们唯一的作用是返回一个值,该值是它们的参数的函数。

    对具有相同参数的同一pure方法的两次调用将返回相同的值。那么,给定对具有相同参数的纯方法的两个调用,HotSpot是否可以优化第二个调用,只需重新使用第一个调用中的值?

    例如:

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

    如果热点未内联 add 在…内 addTwice 它明白吗 添加 纯净的 因此呼吁 添加 只有一次和两倍的返回值?

    当然,这样一个微不足道的(mcve)不太可能引起直接兴趣,但由于内联、发散的控制流、自动生成的代码等原因,在实践中也可能发生类似的情况。

    1 回复  |  直到 7 年前
        1
  •  7
  •   apangin    7 年前

    HotSpot目前无法完成此操作。

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

    另一方面,即使存在这种优化,也不会太有用。纯方法所能做的事情非常有限,因此它们通常很简短,并且很容易内联。在内联之后,JIT更容易在相同的编译范围内进行优化。