Java Double 与 double : class type vs primitive type

标签 java performance class double primitive

我很好奇 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 类型这么慢呢?为什么它甚至被实现为允许数学运算符?

最佳答案

So why is the Double type so much slower?

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

Why is it even implemented to allow mathematical operators?

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

在任何情况下都是如此,使用 LinkedList随机访问元素可能有点矫枉过正,但这并不意味着 LinkedList根本不应该实现。这也不意味着使用链表进行少量随机访问会严重影响性能。

最后一点:在对此类进行基准测试之前,您应该让 VM 预热。

关于Java Double 与 double : class type vs primitive type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15582944/

相关文章:

java - 如何用 ant 确定构建架构(32 位/64 位)?

java - 如何从属性文件读取列表值

java - 从Web应用程序浏览Hdfs集群

Python:最佳字典实现

ios - Parse & Swift - 如何减少服务器负载/请求?

使用toggleClass更改类后的jQuery事件

python - 是否可以在 python 中向导入的类添加属性?

java - rxtx 给我 NoSuchPortException

java - 读取大文本文件、解析每一行并查询 MySQL 的有效方法

java - IntelliJ IDEA 'class' 或 'interface' 预期