考虑代码:
someList.forEach(x -> System.out.format("element %s", x));
理论上,应该可以内联此代码并通过首先内联来消除间接函数调用forEach
方法,然后在 inlined 中内联 lambda 函数体forEach
code.
HotSpot 是否能够执行此优化?在特定情况下是否执行有哪些限制?
您的 lambda 表达式被编译为普通方法,而 JRE 将生成一个实现功能接口并调用该方法的类。在当前的 HotSpot 版本中,这个生成的类几乎像普通类一样工作,主要区别在于它可能会调用private
目标方法并且它不被反向引用ClassLoader
.
这些属性都不会妨碍优化,最终,您只有一串普通的方法调用。当前 JVM 中此类代码的最大障碍是内联限制,涉及最大深度(默认为九个嵌套方法 IIRC)和最大结果代码大小。其中一些默认值非常古老,并且自上次定义以来未进行修订。但是,此类限制可能会影响很长的流管道,而不是像您的普通用例那样的用例forEach
.
因此,一般答案是 HotSpot 能够执行此类优化,但与所有优化一样,它会让您的代码运行几次,然后确定它是否对性能至关重要并执行优化(如果是)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)