在我的Java应用程序中,我有一些方法总是返回相同的东西。那么,JIT是否能够检测到这些方法并优化性能(克隆结果而不是通过其他方法来计算结果)?
用于优化的候选方法示例:
private List<String> get() {
return Arrays.asList(Operation.values()).stream().map(Object::toString).collect(Collectors.toList());
}
在我看来,这是不可能的,但我不确定。
答案 0 :(得分:3)
Common subexpression elimination(CSE)是一种众所周知的编译器优化,可以避免重新计算相同的表达式。通常,JVM可以进行这种优化。
但这不是您的情况。给定的get()
方法不会不返回相同的内容。
首先,假设Operation
是枚举类型,Operation.values()
每次都会返回新数组。它必须返回一个新对象以保护原始数组免遭修改。
Collectors.toList()
每次也会返回一个新的ArrayList
。 JVM无法对此分配执行任何操作,因为返回的对象在外部是可见的。