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