在性能和有效内存使用方面,以下哪项更好?
Boolean isItTrue(arg){
return Boolean.TRUE;
}
boolean isItTrue(arg){
return Boolean.TRUE
}
Boolean isItTrue(arg){
return true;
}
boolean isItTrue(arg){
return true;
}
使用基本类型应该更快更容易,但另一方面,当使用对静态对象的引用时,不会创建新值。或者它是否在编译器级别进行了优化,并且所有true
和false
都被静态对象的引用所取代以节省内存?
答案 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)
我的经验法则如下:
boolean
)。Boolean
)。考虑到这一点,我的默认选择是:
boolean isItTrue(arg){
return true;
}
就性能而言,唯一可以肯定的是,很难想象使用Boolean
比使用boolean
更快的情况。它是慢还是相同取决于很多事情,一般都不可能回答。
如果您真的关心这一点,请在适当的位置分析代码!
答案 8 :(得分:0)
java.lang.Boolean需要16个字节。
如果您只是在寻找性能和内存大小问题,那么这就是您的选择:
boolean isItTrue(arg){
return true;
}