Java Double vs double:类类型 vs primitive type

2022-09-03 00:11:40

我很好奇Java的类和double的基元类型之间的性能差异是什么。因此,我创建了一个小基准测试,发现类类型比基元类型慢3x-7x。(本地计算机 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

那么,为什么双打类型要慢得多呢?为什么它甚至实现为允许数学运算符?


答案 1

那么,为什么双打类型要慢得多呢?

因为该值被包装在一个对象中,该对象需要分配,解除分配,内存管理以及getter和setters。

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

因为autobox旨在允许您使用此类包装器,而不必担心它们不是普通值的事实。你宁愿不能有一个?性能并不总是必要的,根据情况,性能下降3x-7倍可能是可以接受的。优化是一项并不总是存在的要求。ArrayList<Double>

在任何情况下都是如此,使用随机访问元素可能有些过分,但这并不意味着根本不应该实现。这并不意味着对少量随机访问使用链表可能会对性能造成太大干扰。LinkedListLinkedList

最后要注意的是:在对此类内容进行基准测试之前,应让 VM 预热。


答案 2

您通常不会使用 ,等(有时等对于存储“可选”值很有用 - 您可能希望它有时是。这不太可能,因为可用于那些。DoubleIntegerIntegernullDoubleNaN

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


推荐