当Java JIT编译返回始终相同的值时,它可以优化方法吗?

时间:2018-09-18 15:46:53

标签: java performance jit

在我的Java应用程序中,我有一些方法总是返回相同的东西。那么,JIT是否能够检测到这些方法并优化性能(克隆结果而不是通过其他方法来计算结果)?

用于优化的候选方法示例:

private List<String> get() {
    return Arrays.asList(Operation.values()).stream().map(Object::toString).collect(Collectors.toList());
}

在我看来,这是不可能的,但我不确定。

1 个答案:

答案 0 :(得分:3)

Common subexpression elimination(CSE)是一种众所周知的编译器优化,可以避免重新计算相同的表达式。通常,JVM可以进行这种优化。

但这不是您的情况。给定的get()方法不会返回相同的内容。

首先,假设Operation是枚举类型,Operation.values()每次都会返回新数组。它必须返回一个新对象以保护原始数组免遭修改。

当前实施中的

Collectors.toList()每次也会返回一个新的ArrayList。 JVM无法对此分配执行任何操作,因为返回的对象在外部是可见的。