Java性能:true与Boolean.TRUE

时间:2011-08-02 11:49:45

标签: java performance boolean memory-footprint

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

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

boolean isItTrue(arg){
    return Boolean.TRUE
}

Boolean isItTrue(arg){
    return true;
}

boolean isItTrue(arg){
    return true;
}

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

9 个答案:

答案 0 :(得分:24)

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


这些示例都不涉及创建Boolean个实例。从理论上讲,4个中的3个将触发Boolean类的初始化......并且您的应用程序本来不会这样做。在极不可能的事件中,您的整个应用程序将分配2个本来不会被分配的对象。


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

boolean isItTrue(arg){
    return true;
}

孤立地,这必须从内存加载静态引用,而不是寄存器的零。但是,在某些情况下,JIT编译器可能能够优化它。

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

从表面上看,这需要调用Boolean.valueOf(true)来“装箱”true,但是JIT编译器应该能够通过内联将其优化为与前一个相同的代码。电话。

Boolean isItTrue(arg){
    return true;
}

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

boolean isItTrue(arg){
    return Boolean.TRUE
}

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

答案 1 :(得分:11)

如果有任何性能提升,那么它就是无关紧要的。 在任何情况下,Boolean.TRUE和Boolean.FALSE都不返回新对象。

答案 2 :(得分:8)

支持代码维护者对此类微优化的清晰度。问题不应该是“哪个更小/更快”,首先表达你的意思。

如果该方法返回一个布尔对象,那么接收的任何人都需要决定是否有可能为null,如果 为null,则可能意味着与true / false不同,就像“我们不知道”。

所以返回布尔类型,如果这是你的意思,否则,如果你想允许Null,那么布尔。

如果返回一个布尔值,那么

return true; // or false

必须优于依靠自动装箱,再次为了清晰和性能。

如果返回布尔值

return Boolean.TRUE

必须是好的,它只是避免产生额外的垃圾,就像我反对微观优化一样,我认为没有任何价值是故意效率低下的。我认为你的回归类型明显匹配也更清楚。

答案 3 :(得分:7)

他们会快得多。我不认为这两者之间会有任何区别。

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

boolean isItTrue(arg){
    return true;
}

但是其他实现会更慢,因为它将在后端装箱和拆箱,需要一段时间的处理器。


修改

我通过实施4种不同的方式收集了一些事实。只想与你分享,如果是写作方式,我不会这样做。

Boolean isItTrue(){ 
    return Boolean.TRUE;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.844
Free Memory After Process --> 15940472
Memory Usage --> 90464

boolean isItTrue(){
    return Boolean.TRUE;
}

Free Memory before start --> 16030936
Time taken in Secs --> 10.109
Free Memory After Process --> 15940472
Memory Usage --> 90464

Boolean isItTrue(){
    return true;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.906
Free Memory After Process --> 15940472
Memory Usage --> 90464

boolean isItTrue(){
    return true;
}

Free Memory before start --> 16030936
Time taken in Secs --> 7.828
Free Memory After Process --> 15940472
Memory Usage --> 90464

主类

public static void main(String[] args){
    NewClass n = new NewClass();

    long sysTime = System.currentTimeMillis();

    Runtime rt = Runtime.getRuntime();
    long freeMem = rt.freeMemory();
    System.out.println( "Free Memory before start --> " + freeMem );
    for( int i = 0; i < Integer.MAX_VALUE; i++ ){
        n.isItTrue();
    }
    System.out.println( "Time taken in Secs --> " + (System.currentTimeMillis() - sysTime)/1000D);
    System.out.println( "Free Memory After Process --> " + rt.freeMemory() );
    System.out.println( "Memory Usage --> " + ( freeMem - rt.freeMemory() ) );
}

答案 4 :(得分:3)

最后一个

boolean isItTrue(arg){
    return true;
}

仅当方法有时需要返回Boolean

时才使用null

答案 5 :(得分:2)

通过这种逻辑,对静态对象本身的引用与真值一样昂贵,如果不是更多的话。

使用对象可能比原语慢一些,但我不担心:差异无关紧要。

答案 6 :(得分:2)

使用最后一个(仅boolean)。即使编译器将它们全部优化到同一个东西,至少你使编译器的工作变得更容易(你知道这不是一件容易的工作!)。

此外,按键次数减少(不需要按键)。但实际上,你应该使用包装类的唯一原因是你需要能够将它设置为null,并用于LinkedList<E>这样的通用数据结构。

答案 7 :(得分:1)

我的经验法则如下:

  1. 默认选项是基本类型(boolean)。
  2. 如果我需要可空性或需要将值存储在容器中,我会使用类(Boolean)。
  3. 考虑到这一点,我的默认选择是:

    boolean isItTrue(arg){
        return true;
    }
    

    就性能而言,唯一可以肯定的是,很难想象使用Boolean比使用boolean 更快的情况。它是慢还是相同取决于很多事情,一般都不可能回答。

    如果您真的关心这一点,请在适当的位置分析代码!

答案 8 :(得分:0)

java.lang.Boolean需要16个字节。

如果您只是在寻找性能和内存大小问题,那么这就是您的选择:

boolean isItTrue(arg){
    return true;
}