首页 > 解决方案 > Java JIT编译可以在返回始终相同的值时优化方法吗?

问题描述

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

优化候选方法的示例:

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

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

标签: javaperformancejit

解决方案


公共子表达式消除(CSE) 是一种众所周知的编译器优化,用于避免重新计算相同的表达式。一般来说,JVM 能够进行这样的优化。

但这不是你的情况。给定的get()方法不会返回相同的东西。

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

Collectors.toList()ArrayList在其当前的实现中也每次返回一个新的。JVM 无法对此分配做任何事情,因为返回的对象在外部可见。


推荐阅读