Java Double vs Double:类类型vs基元类型

Java Double vs Double:类类型vs基元类型,java,performance,class,double,primitive,Java,Performance,Class,Double,Primitive,我很好奇Java的类和double的原语类型之间的性能差异是什么。所以我创建了一个小基准测试,发现类类型比基元类型慢3-7倍。(本地机器OSX上3倍,ideone上7倍) 以下是测试: class Main { public static void main(String args[]) { long bigDTime, littleDTime; { long start = System.nanoTime();

我很好奇Java的类和double的原语类型之间的性能差异是什么。所以我创建了一个小基准测试,发现类类型比基元类型慢3-7倍。(本地机器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));
    }
}
主类{
公共静态void main(字符串参数[]){
大时间长,时间少;
{
长启动=System.nanoTime();
双d=0.0;
对于(双i=0.0;i<143143.341;i+=0.1){
d+=i;
}
long end=System.nanoTime();
bigDTime=结束-开始;
System.out.println(bigDTime);
}
{
长启动=System.nanoTime();
双d=0.0;
对于(双i=0.0;i<143143.341;i+=0.1){
d+=i;
}
long end=System.nanoTime();
littleDTime=结束-开始;
系统输出打印项次(LittleTime);
}
System.out.println(“D/D=“+(bigDTime/littletime));
}
}

那么为什么双人型的速度要慢得多呢?为什么它甚至实现为允许数学运算符

那么为什么双人型的速度要慢得多呢

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

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

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

这在任何情况下都是正确的,使用
LinkedList
随机访问元素可能会过分,但这并不意味着根本不应该实现
LinkedList
。这也不意味着使用链表进行少量随机访问会对性能造成如此大的影响


最后一点注意事项:在对这些事情进行基准测试之前,您应该让VM预热。

Double
是一种装箱的
Double
。因此,一般来说,编译后的代码必须先检查
Double
是否为null,然后再对其执行任何操作。这当然比什么都不做要慢


Double
(以及原语的其他盒装版本)非常有用,因为它是一个
对象。这允许您将其传递给将接受
对象的函数,并将其转换回其他地方的
Double
。更有用的是,它允许泛型类型包含它:泛型类型不能包含
double
或任何其他原语,但它可以包含
double
通常不会使用的
double
Integer
等。(有时
Integer
等可用于存储“可选”值-有时您可能希望它为
null
。使用
Double
的可能性较小,因为
NaN
可用于这些值。)


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

由于需要装箱和取消装箱,所以速度很慢。这是预期的行为。@HovercraftFullOfEels这是有意义的,但似乎仍然有很大的开销。这是很大的开销。f或者,您应该避免在时间关键型代码中使用基本包装类型。多线程程序的成本更高。这是因为使用
Double
实际上是在用垃圾填充缓存,这在大多数情况下会减慢其他线程的速度。