Java Double vs double:类类型与原始类型

我很好奇Java的类和double的原始类型之间的性能差异。 所以我创建了一个小基准测试,发现类类型比基本类型慢3到7倍。 (在本地机器OSX上为3倍,在ideone上为7倍)

这是测试:

class Main { public static void main(String args[]) { long bigDTime, littleDTime; { long start = System.nanoTime(); Double d = 0.0; for (Double i = 0.0; i < 1432143.341; i += 0.1) { d += i; } long end = System.nanoTime(); bigDTime = end - start; System.out.println(bigDTime); } { long start = System.nanoTime(); double d = 0.0; for (double i = 0.0; i < 1432143.341; i += 0.1) { d += i; } long end = System.nanoTime(); littleDTime = end - start; System.out.println(littleDTime); } System.out.println("D/d = " + (bigDTime / littleDTime)); } } 

http://ideone.com/fDizDu

那么为什么Double类型这么慢呢? 为什么甚至实现允许数学运算符?

那么为什么Double类型这么慢呢?

因为该值包含在需要分配,释放,内存管理以及getter和setter的对象中

为什么甚至实现允许数学运算符?

因为autobox旨在允许你使用这样的包装器而不用担心它们不是普通的值。 你不希望没有ArrayList吗? 性能并不总是必要的,并且根据情况可以接受3x-7x的性能下降。 优化是一项并非始终存在的要求。

在每种情况下都是如此,使用LinkedList到随机访问元素可能过度,但这并不意味着不应该实现LinkedList 。 这并不意味着使用链接列表进行少量随机访问可能会对性能造成太大影响。

最后一点 :在对这些事情进行基准测试之前,你应该让VM热身。

你通常不会使用DoubleInteger等(偶尔Integer等可以用于存储’可选’值 – 你有时可能希望它为null 。这对于Double来说是不太可能的,因为NaN可用于那些。 )

Double存在的原因如下。 Java有两种主要类型的值:对象(基本上类似于没有算术的C / C ++指针)和原始值(例如double )。 像ArrayList这样的类可以被定义为接受任何Object ,它允许用户将StringFile或任何他们喜欢的东西存储在一个中 – 但是这样的定义不包括像double这样的原始值。 所以像Double这样的类存在使得像ArrayList这样的类更容易存储double ,而不需要ArrayList的作者为所有基本类型创建特殊版本。

Double是盒装double 。 因此,通常编译的代码必须在对它做任何事情之前检查Double for null。 这当然比什么都不做要慢。

Double (和其他盒装版本的基元)很有用,因为它是一个Object 。 这允许您将它传递给将接受Object函数,并将其ObjectDouble到其他地方。 更有用的是,它允许generics类型包含它:generics类型不能包含double或任何其他原语,但它可以包含Double