[英]Primitive variables perform calculations faster than their associated wrapper class
这是一本有关Java的书的准确陈述。 有人可以确认这是否正确吗?
为什么在包装类上完成的操作成本会比原始类高?
当然是对的。 使用包装器类时,会发生很多事情:
1)从原始对象到对象的隐式转换,这并不容易,很多包装类的私有变量被填充为原始对象创建对象。 我认为这是开销。
2)如果不是原始检查,他们还必须进行null检查,要避免使用著名的NPE(NullPointerException),这是额外的开销。
造成这种情况的原因很多,但我相信您已经找到了答案。 :)
有人可以确认这是否正确吗?
是的,可以构建一个非常粗糙的基准来证明对基元的操作至少快一个数量级:
// 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.");
Primitives: 1125085 x1000 additions completed.
Wrapper: 112760 x1000 additions completed.
如您所见,即使在这种非常原始的测试中,原始时间至少要快十倍,在这种测试中,时间花费了很大一部分时间。
为什么在包装类上完成的操作成本会比原始类高?
这很容易解释:除了在基元上执行的操作本身之外,包装程序上的操作还需要以下操作:
与对基元内部的值执行的算术运算相比,分配运算特别昂贵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.