Java Double与Double:类类型与原始类型
问题内容:
我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x)
这是测试:
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));
}
}
那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符?
问题答案:
那么为什么Double类型要慢得多呢?
因为该值包装在需要分配,释放,内存管理以及getter和setter的对象中
为什么还要实施它以允许数学运算符?
因为autobox旨在允许您使用此类包装,而不必担心它们不是纯值。您是否希望不能拥有ArrayList<Double>
?性能 并非总是
必要的,根据情况将性能降低3-7倍是可以接受的。优化是不总是存在的要求。
在每种情况下都是如此,LinkedList
对随机访问元素使用a
可能会过大,但这并不意味着完全LinkedList
不应实施。这都不意味着对很少的随机访问使用链表会极大地影响性能。
最后一点 :基准测试之前,应先让虚拟机预热。