繁体   English   中英

基本变量比其关联的包装器类执行计算更快

[英]Primitive variables perform calculations faster than their associated wrapper class

这是一本有关Java的书的准确陈述。 有人可以确认这是否正确吗?

为什么在包装类上完成的操作成本会比原始类高?

当然是对的。 使用包装器类时,会发生很多事情:

1)从原始对象到对象的隐式转换,这并不容易,很多包装类的私有变量被填充为原始对象创建对象。 我认为这是开销。

2)如果不是原始检查,他们还必须进行null检查,要避免使用著名的NPE(NullPointerException),这是额外的开销。

造成这种情况的原因很多,但我相信您已经找到了答案。 :)

Why operation cost done on wrapper classes will be higher than ??

因为在运行时,如果我们使用Wrappers 装箱转换,而在装箱时发生拆箱转换 ,显然这会花费更多时间。

例如。

考虑intInteger

运行时间

如果p是int类型的值,则装箱转换将p转换为类和Integer类型的引用r,这样r.intValue()== p

反之亦然,如果使用Primitives话,这将节省时间。

有人可以确认这是否正确吗?

是的,可以构建一个非常粗糙的基准来证明对基元的操作至少快一个数量级:

// Use a primitive type long
long now = System.currentTimeMillis();
long count = 0;
long total1 = 0;
do {
    for (int i = 0 ; i != 1000 ; i++)
        total1 += 11;
    count++;
} while (System.currentTimeMillis()-now < 2000);
System.out.println("Primitives: "+count+"  x1000 additions completed.");
// Use a wrapper type Long
now = System.currentTimeMillis();
count = 0;
Long total2 = 0L;
do {
    for (int i = 0 ; i != 1000 ; i++)
        total2 += 11;
    count++;
} while (System.currentTimeMillis()-now < 2000);
System.out.println("Wrapper: "+count+"  x1000 additions completed.");

在ideone上产生以下结果

Primitives: 1125085 x1000 additions completed.
Wrapper:     112760 x1000 additions completed.

如您所见,即使在这种非常原始的测试中,原始时间至少要快十倍,在这种测试中,时间花费了很大一部分时间。

为什么在包装类上完成的操作成本会比原始类高?

这很容易解释:除了在基元上执行的操作本身之外,包装程序上的操作还需要以下操作:

  • 访问包装类型的内容(即另一个内存读取),
  • 构造一个新的包装对象,以及
  • 隐式地,先前运行中未使用的包装器会增加垃圾收集器所花费的时间。

与对基元内部的值执行的算术运算相比,分配运算特别昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM