programacion - tipos de datos primitivos java
Java doble vs doble: tipo de clase vs tipo primitivo (3)
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));
}
}
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 captadores y definidores
¿Por qué incluso se implementa para permitir operadores matemáticos?
Porque autobox está destinado a permitirle usar tales envoltorios sin preocuparse por el hecho de que no son valores simples. ¿Preferirías no poder tener una ArrayList<Double>
? 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 con el rendimiento.
Una nota final : debe dejar que la máquina virtual se caliente antes de hacer 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. )
La razón por la que Double
existe es la siguiente. Java tiene dos tipos principales de valor: objetos (esencialmente como punteros C / C ++ sin la aritmética) y valores primitivos (por ejemplo, double
). Las clases como ArrayList
se pueden definir 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 compilado 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 genéricos lo contengan: un tipo genérico no puede contener el double
o cualquier otra primitiva, pero puede contener un Double
.