35

Which of the following is better in terms of performance and efficient memory usage?

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

boolean isItTrue(arg){
    return Boolean.TRUE
}

Boolean isItTrue(arg){
    return true;
}

boolean isItTrue(arg){
    return true;
}

It should be faster and easier to work with primitive types, but on the other hand, when using a reference to a static object, no new value is created. Or is it optimized on compiler level and all true and false are replaced by references to the static objects to save memory?

4

9 回答 9

31

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


没有一个示例涉及创建Boolean实例。

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


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

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 编译器可以(至少在理论上)为所有这些生成相同的(最佳)代码。

于 2011-08-02T12:11:17.510 回答
13

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

于 2011-08-02T11:52:48.310 回答
12

让代码维护者更清楚这种微优化。问题不应该是“哪个更小/更快”,首先它表达了你的意思。

如果该方法返回一个布尔对象,那么接收者需要确定它是否有可能为空,如果它空,则它可能意味着与真/假不同的东西,例如“我们不知道”。

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

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

return true; // or false

必须比依赖自动装箱更好,同样是为了清晰和性能。

如果返回布尔值,则

return Boolean.TRUE

一定很好,它只是避免产生额外的垃圾,就像我反对微优化一样,我认为故意低效没有任何价值。我认为这也更清楚,因为您明显匹配返回类型。

于 2011-08-02T11:58:19.840 回答
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() ) );
}
于 2011-08-02T11:54:16.690 回答
4

最后一个

boolean isItTrue(arg){
    return true;
}

Boolean仅在该方法有时需要返回时使用null

于 2011-08-02T11:52:34.380 回答
3

我的经验法则如下:

  1. 默认选择是原始类型 ( boolean)。
  2. 如果我需要可空性或需要将值存储在容器中,我使用类 ( Boolean)。

考虑到这一点,我的默认选择是:

boolean isItTrue(arg){
    return true;
}

就性能而言,唯一似乎可以肯定的是,很难想象 usingBoolean比using更快boolean的场景。它是否会更慢或相同取决于很多事情,一般来说不可能回答。

如果您真的关心这一点,请在重要的地方分析代码!

于 2011-08-02T11:53:06.383 回答
2

按照这种逻辑,对静态对象本身的引用与真值一样昂贵,甚至更多。

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

于 2011-08-02T11:53:42.513 回答
2

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

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

于 2011-08-02T11:56:04.943 回答
0

java.lang.Boolean 占用 16 个字节。

如果您只是在寻找性能和内存大小问题,这是要走的路:

boolean isItTrue(arg){
    return true;
}
于 2011-08-02T11:53:38.437 回答