Envolturas de tipos primitivos en ArrayList vs matrices
-
14-10-2019 - |
Pregunta
En "Core java 1" He leído
PRECAUCIÓN: Un ArrayList está lejos menos eficiente que un int [] array porque cada valor es separado envuelto dentro de un objeto. Lo harías sólo desea utilizar esta construcción para pequeñas colecciones cuando programador la comodidad es más importante que eficiencia.
Pero en mi software que he utilizado ya Arraylist en lugar de matrices normales debido a algunos requisitos, aunque "El software se supone que tienen un alto rendimiento y después de haber leído el texto citado empecé a sentir pánico!" una cosa que puedo cambiar es el cambio de las variables dobles a doble fin de evitar que el boxeo de auto y no sé si eso es la pena o no, en la muestra siguiente algoritmo
public void multiply(final double val)
{
final int rows = getSize1();
final int cols = getSize2();
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
this.get(i).set(j, this.get(i).get(j) * val);
}
}
}
Mi pregunta se hace cambiando doble a doble marca la diferencia? o que es una optimización de micro que no afectará nada? ten en cuenta que podría estar utilizando grandes matrices.2nd debo considerar el rediseño de todo el programa de nuevo?
Solución
El gran problema con double
frente Double
es que este último añade una cierta cantidad de sobrecarga de memoria - 8 bytes por objeto en un Sun JVM de 32 bits, posiblemente, más o menos de los demás. Luego hay otras 4 bytes (8 en un 64-bit JVM) para referirse al objeto.
Por lo tanto, asumiendo que tiene 1.000.000 de objetos, las diferencias son las siguientes:
double[1000000]
8 bytes por entrada; Total = 8.000.000 bytes
Double[1000000]
16 bytes por instancia de objeto + 4 bytes por referencia; Total = 20.000.000 bytes
Si o No esta materia depende mucho de su aplicación. A menos que usted se encuentra el funcionamiento de la memoria, asumir que no tiene importancia.
Otros consejos
Se cambia el lugar donde sucede autoboxing, pero nada más.
Y segundo - no, no se preocupe por esto. Es poco probable que sea un cuello de botella. Puede hacer que algunos puntos de referencia para medir por el tamaño de los datos, para demostrar que la diferencia es insignificante en lo que respecta a su rendimiento de las aplicaciones.
Doble es dramáticamente más caro que el doble, sin embargo en el 90% de los casos no importa.
Si quieres una clase de matriz eficiente, sugeriría que utilice una de las bibliotecas que ya hacen esto de manera eficiente. p.ej. Jama.
Cambiar el argumento double
en Double
no ayudará mucho, que empeorará ligeramente el rendimiento, ya que tiene que ser sin embalaje para la multiplicación.
¿Qué le ayuda es la prevención de varias llamadas a get()
como en:
for (int i = 0; i < rows; i++)
{
List row = this.get(i);
for (int j = 0; j < cols; j++)
{
row.set(j, row.get(j) * val);
}
}
(por cierto, que supuso el tipo de fila.)
Si se asume que utiliza una lista de listas, el uso de iteradores en lugar de geting y el establecimiento a través de los índices de bucle va a ganar un poco más de rendimiento.