首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >就性能而言,隐式(自动)拆箱和显式拆箱,哪个更好?

就性能而言,隐式(自动)拆箱和显式拆箱,哪个更好?
EN

Stack Overflow用户
提问于 2011-08-03 01:11:17
回答 4查看 1.7K关注 0票数 1

把它放到代码中--哪一个性能更好(如果有区别的话)?

考虑到这一点:

代码语言:javascript
复制
public class Customer
{
    ....

    public Boolean isVIP(){...}
    ...
}

哪个更快?

代码语言:javascript
复制
public void handleCustomer(Customer customer)
{
    if (customer.isVIP())  // Auto Unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}

或者这样:

代码语言:javascript
复制
public void handleCustomer(Customer customer)
{
    if (customer.isVIP().booleanValue()) // Explicit unboxing
    {
        handleNow(customer);
    }
    else
    {  
        sayHandlingNowButQueueForTomorrow(customer);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-03 01:48:56

它们之间没有区别,您可以在字节码中进行验证:

代码语言:javascript
复制
public class ImplicitTest {
    public static void main(String[] args) {
        Boolean b = true; 
        boolean i = b;
        boolean e = b.booleanValue();
    }
}

运行javap查看它编译成的结果:

代码语言:javascript
复制
javap -c ImplicitTest

下面是输出:

代码语言:javascript
复制
Compiled from "ImplicitTest.java"
public class ImplicitTest extends java.lang.Object{
public ImplicitTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   invokestatic    #2; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
   4:   astore_1
   5:   aload_1
   6:   invokevirtual   #3; //Method java/lang/Boolean.booleanValue:()Z
   9:   istore_2
   10:  aload_1
   11:  invokevirtual   #3; //Method java/lang/Boolean.booleanValue:()Z
   14:  istore_3
   15:  return

}

如你所见-第5,6,9行(隐式)与10,11,14 (显式)相同。

票数 14
EN

Stack Overflow用户

发布于 2011-08-03 01:17:06

区别应该都在编译时,因为自动拆箱只是语法上的糖。在这种情况下,生成的Java字节码应该完全相同。这意味着在运行时没有区别。然而,在更一般的情况下,显式拆箱可能会更快,因为隐式拆箱可能会多次拆箱,而使用显式拆箱可以保证只对值拆箱一次,并存储结果。

票数 8
EN

Stack Overflow用户

发布于 2011-08-03 01:20:40

在性能方面,理想情况下它们应该是相同的。

人工编写的技术有可能不是最优的,所以如果您使用糟糕的人工编写的自动装箱方法,可能会影响性能。但是,如果你真的想要得到它,那么一个人可能会写出某种非通用的解决方案,而不是默认的性能。这样的解决方案不太灵活,而且它可能会牺牲计算复杂性来换取内存(比如大的查找数组)。

就我个人而言,我建议花一些时间来真正地看大局。优化一两行代码几乎从来不是一项好的投资。在整个程序中减少必要的工作量更有可能使您的性能得到提升。

请注意,在一般情况下,JVM不会随着自动装箱的引入而改变,只是编译器改变了。因此,编译器添加的指令与您在最常见的情况下手动编写的指令相同。性能是在运行时在JVM中测量的,如果这两种方式都是相同的字节码,就没有理由期望性能差异。

这有点过早优化的味道,但如果你认为你可以发现时间上的差异:通过仔细的测试来做到这一点,然后意识到它可能在不同的点发布,操作系统等上是不同的。这在任何情况下都不是明确的胜利。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6915823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档