原始变量比相关的包装类执行计算的速度更快

时间:2013-08-31 05:53:15

标签: java

这是一本关于Java的书的确切陈述。 有人可以确认这是否确实是对的吗?

为什么在包装类上完成的操作成本会高于它们的原始对应物?

3 个答案:

答案 0 :(得分:3)

当然这是对的。使用包装类时会出现很多事情:

1)将原语隐式转换为Objects,这并不容易填充包装类的许多私有变量来为基元创建对象。我相信这是一个开销。

2)如果它不是原始的,它们还必须处理空检查,你知道要避免使用着名的NPE(NullPointerException),这是一个额外的开销。

有很多这样的原因,但我相信你得到了答案。 :)

答案 1 :(得分:1)

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

因为在运行时,如果我们在运行时使用Wrappers Boxing conversionsUnboxing Conversions,显然需要更多时间。

例如。

考虑使用intInteger

的案例

运行时间

  

如果p是int类型的值,那么装箱转换将p转换为类的引用r并输入Integer,这样r.intValue()== p

反之亦然,如果我们使用Primitives,则会保存此时间。

答案 2 :(得分:1)

  

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

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

// 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.");

produces the following results on ideone

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

正如您所看到的,基元的速度至少要快十倍,即使是在非常粗糙的测试中,测量时间也需要相当长的时间。

  

为什么在包装类上完成的操作成本会高于其原始对应项?

这很容易解释:除了在原语上执行的操作本身之外,包装器上的操作还需要这些操作:

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

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