Java性能:true与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都被静态对象的引用所取代以节省内存?

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


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


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

 boolean isItTrue(arg){ return true; } 

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

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

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

 Boolean isItTrue(arg){ return true; } 

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

 boolean isItTrue(arg){ return Boolean.TRUE } 

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

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

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

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

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

如果返回一个布尔值

 return true; // or false 

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

如果返回布尔然后

 return Boolean.TRUE 

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

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

 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() ) ); } 

最后一个

 boolean isItTrue(arg){ return true; } 

如果方法有时需要返回null我只使用Boolean

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

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

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

此外,它的击键次数更少(不需要按下换档)。 但实际上,你应该使用包装类的唯一原因是你需要能够将它设置为null ,以及用于像LinkedList这样的通用数据结构。

我的经验法则如下:

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

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

 boolean isItTrue(arg){ return true; } 

就性能而言,唯一可以肯定的是,很难想象使用Boolean比使用boolean 更快的场景。 它是慢还是一样取决于很多东西,一般来说都不可能回答。

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

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

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

 boolean isItTrue(arg){ return true; }