Java JIT 编译可以优化一个方法,当它 returns 总是相同的值?
Java JIT compilation can optimize a method when it returns always the same value?
在我的 Java 应用程序中,我有一些方法总是 return 相同的东西。那么,JIT 是否能够检测这些方法并优化性能(克隆结果而不是计算结果或其他方式)?
优化的候选方法示例:
private List<String> get() {
return Arrays.asList(Operation.values()).stream().map(Object::toString).collect(Collectors.toList());
}
在我看来这是不可能的,但我不确定。
Common subexpression elimination (CSE) 是一种众所周知的编译器优化,可避免重新计算相同的表达式。一般情况下,JVM 是可以做到这样的优化的。
但这不是你的情况。给定的 get()
方法做 而不是 return 相同的事情。
首先假设Operation
是枚举类型,Operation.values()
return每次都是新数组。它必须return一个新对象来保护原始数组不被修改。
Collectors.toList()
在其当前的实现中也每次 return 一个新的 ArrayList
。 JVM 无法对此分配做任何事情,因为 returned 对象在外部可见。
在我的 Java 应用程序中,我有一些方法总是 return 相同的东西。那么,JIT 是否能够检测这些方法并优化性能(克隆结果而不是计算结果或其他方式)?
优化的候选方法示例:
private List<String> get() {
return Arrays.asList(Operation.values()).stream().map(Object::toString).collect(Collectors.toList());
}
在我看来这是不可能的,但我不确定。
Common subexpression elimination (CSE) 是一种众所周知的编译器优化,可避免重新计算相同的表达式。一般情况下,JVM 是可以做到这样的优化的。
但这不是你的情况。给定的 get()
方法做 而不是 return 相同的事情。
首先假设Operation
是枚举类型,Operation.values()
return每次都是新数组。它必须return一个新对象来保护原始数组不被修改。
Collectors.toList()
在其当前的实现中也每次 return 一个新的 ArrayList
。 JVM 无法对此分配做任何事情,因为 returned 对象在外部可见。