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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top