Java doble vs doble: tipo de clase vs tipo primitivo

Tenía curiosidad por saber cuáles eran las diferencias de rendimiento entre la clase de Java y el tipo primitivo para el doble. Así que creé un pequeño punto de referencia y encontré que el tipo de clase era 3x-7x más lento que el tipo primitivo. (3x en la máquina local OSX, 7x en ideone)

Aquí está la prueba:

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

Entonces, ¿por qué el tipo Doble es mucho más lento? ¿Por qué incluso se implementa para permitir operadores matemáticos?

Entonces, ¿por qué el tipo doble es mucho más lento?

Debido a que el valor está envuelto dentro de un objeto que necesita asignación, desasignación, administración de memoria, más getters y setters

¿Por qué incluso se implementa para permitir operadores matemáticos?

Debido a que autobox está diseñado para permitirle usar dichos envoltorios sin preocuparse por el hecho de que no son valores simples. ¿Preferirías no poder tener una ArrayList ? El rendimiento no siempre es necesario y una caída de 3x-7x de rendimiento según las situaciones puede ser aceptable. La optimización es un requisito que no siempre está presente.

Esto es cierto en todas las situaciones, el uso de una LinkedList para elementos de acceso aleatorio podría ser excesivo, pero esto no significa que la LinkedList no deba implementarse en absoluto. Esto tampoco significa que el uso de una lista enlazada para pocos accesos aleatorios podría interferir tanto en el rendimiento.

Una nota final : debe dejar que la máquina virtual se caliente antes de realizar una evaluación comparativa de tales cosas.

Normalmente no usaría Double , Integer , etc. (Ocasionalmente, Integer etc. puede ser útil para almacenar un valor ‘opcional’; es posible que desee que sea null veces. Esto es menos probable con Double porque NaN está disponible para ellos. )

El motivo por el que Double existe es el siguiente. Java tiene dos tipos principales de valor: objetos (esencialmente como punteros C / C ++ sin aritmética) y valores primitivos (por ejemplo, double ). Se pueden definir clases como ArrayList para aceptar cualquier Object , lo que permite a los usuarios almacenar String , File o lo que quieran en uno, pero los valores primitivos como el double no están cubiertos por dicha definición. Por lo tanto, existen clases como Double para que sea más fácil para las clases como ArrayList almacenar el double s, sin requerir que los autores de ArrayList creen versiones especiales para todos los tipos primitivos.

Double es un double caja. Por lo tanto, en general, el código comstackdo debe verificar el Double para nulo antes de hacer algo con él. Esto es, por supuesto, más lento que no hacer nada.

Double (y otras versiones en caja de los primitivos) es útil porque es un Object . Esto le permite pasarlo a las funciones que tomarían un Object , y convertirlo en Double en otro lugar. Más útil, permite que los tipos generics lo contengan: un tipo genérico no puede contener el double o cualquier otra primitiva, pero puede contener un Double .