Java 性能:true vs. Boolean.TRUE

以下哪项在性能和高效内存使用方面更好?

Boolean isItTrue(arg){ 
    return Boolean.TRUE;
}

boolean isItTrue(arg){
    return Boolean.TRUE
}

Boolean isItTrue(arg){
    return true;
}

boolean isItTrue(arg){
    return true;
}

使用基元类型应该更快、更容易,但另一方面,当使用对静态对象的引用时,不会创建新值。或者它是否在编译器级别和所有级别进行了优化,并被对静态对象的引用所取代以节省内存?truefalse


答案 1

首先,使用任何一个的性能优势都比使用其他任何一个都大可能太小而无法相关。代码简单性/可读性/可维护性是一个更重要的...在绝大多数情况下。


这些示例都不涉及创建实例。Boolean

从理论上讲,4个中的3个可以触发类的初始化,并且您的应用程序不会这样做。在这种极不可能的事件中,整个应用程序将分配 2 个对象,否则这些对象将不会被分配。初始化可能需要几微秒,并且从长远来看会消耗几字节的RAM(小于50)。Boolean


这个将等于或比所有其他的相同或更快,因为它只需要将寄存器设置为零。

boolean isItTrue(arg){
    return true;
}

单独来看,这必须从存储器加载静态基准电压源,而不是将寄存器归零。但是,在某些情况下,JIT 编译器可能能够优化此参数。

Boolean isItTrue(arg){ 
    return Boolean.TRUE;
}

从表面上看,这涉及对 “box” the 的调用,但 JIT 编译器应该能够通过内联调用将其优化为与前一个代码相同的代码。Boolean.valueOf(true)true

Boolean isItTrue(arg){
    return true;
}

从表面上看,这涉及调用“取消装箱”。此调用可以内联。JIT 编译器还可以避免加载对对象的引用并获取其值字段。Boolean.booleanValue(Boolean.TRUE)BooleanBoolean

boolean isItTrue(arg){
    return Boolean.TRUE
}

最重要的是,4种替代方案的相对性能取决于JIT编译器在优化方面的成功程度。这将取决于上下文、JIT 编译器的特定性、JVM 设置等。在最好的情况下,JIT编译器可以(至少在理论上)为所有编译器生成相同的(最佳)代码。


答案 2

如果有任何性能提升,那将是微不足道的,以至于无关紧要。Boolean.TRUE 和 Boolean.FALSE 在任何情况下都不会返回新对象。


推荐