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));
    }
}

http://ideone.com/fDizDu

那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符?


问题答案:

那么为什么Double类型要慢得多呢?

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

为什么还要实施它以允许数学运算符?

因为autobox旨在允许您使用此类包装,而不必担心它们不是纯值。您是否希望不能拥有ArrayList<Double>?性能 并非总是
必要的,根据情况将性能降低3-7倍是可以接受的。优化是不总是存在的要求。

在每种情况下都是如此,LinkedList对随机访问元素使用a
可能会过大,但这并不意味着完全LinkedList不应实施。这都不意味着对很少的随机访问使用链表会极大地影响性能。

最后一点 :基准测试之前,应先让虚拟机预热。