Pregunta

Tengo una bastante caro de la matriz de cálculo (SpectralResponse) que me gusta mantener a un mínimo.Pensé que la mejor manera es almacenarlos y traerlo de vuelta hasta cuando la misma matriz se necesita de nuevo en el futuro.La decisión es hecha usando BasicParameters.

Así que ahora, yo uso una LinkedList de objeto para las matrices de SpectralResponse, y otro LinkedList para la BasicParameter.Y el BasicParameters tiene un isParamsEqualTo(BasicParameters) método para comparar el conjunto de parámetros.

LinkedList<SpectralResponse> responses
LinkedList<BasicParameters> fitParams
LinkedList<Integer> responseNumbers

Así que lo mire, acabo de ir a través de la lista de BasicParameters, de verificación para el partido, si corresponde, el regreso de la SpectralResponse.Si no coinciden, entonces calcular el SpectralResponse.

Aquí es el de bucle que se utiliza para la búsqueda.

size: LinkedList size, limited to a reasonable value
responseNumber: just another variable to distinguish the SpectralResponse.

    for ( i = size-1; i > 0 ; i--) {
        if (responseNumbers.get(i) == responseNum)
        {
            tempFit = fitParams.get(i);
            if (tempFit.isParamsEqualTo(fit))
            {
                return responses.get(i);
            }
        }
    }

Pero de alguna manera, haciendo de esta manera no sólo sacar un montón de memoria, es realmente más lento que sólo el cálculo de SpectralResponse recta.Mucho más lento.

Así es mi aplicación que está mal, o me equivoqué de que siempre puede calcular previamente la búsqueda y es más rápido?

¿Fue útil?

Solución

Usted está accediendo a una Lista enlazada mediante un índice, esta es la peor forma posible para acceder a ella;)

Debe utilizar ArrayList en lugar, o usar iteradores para todas sus listas.

Posiblemente se debe fusionar los tres objetos en una sola, y mantenerlos en un mapa con responseNum como clave.

Espero que esto ayude!

Otros consejos

Probablemente debería utilizar un tipo de matriz (una matriz real, como Vector, ArrayList), las listas no vinculados. Las listas enlazadas es mejor para pila o la operación de cola, no indexación (ya que hay que atravesar de un extremo). Vector es una matriz de cambio de tamaño automático, wich tiene menos sobrecarga en el acceso inexes.

Los get (i) los métodos de ListaEnlazada requieren que a buscar cada elemento tiene que ir más allá y más allá en la lista. Considere el uso de un ArrayList, el método iterador (), o simplemente una matriz.

La segunda línea, 'if (responseNumbers.get(i) == responseNum)' también será ineficaz como el responseNumbers.get(i) es un entero, y tiene que ser sin embalaje a un int (Java 5 en adelante lo hace automáticamente, su código no se compilará en Java 1.4 o antes si responseNum se declara como un int). Ver este para más información sobre el boxeo.

Para eliminar esta sobrecarga unboxing, utilizar un intlist de la biblioteca primitivas Apache. Esta biblioteca contiene colecciones que almacenan los objetos subyacentes (Ints en su caso) como una matriz primitiva (por ejemplo int []) en lugar de una matriz de objetos. Esto significa que no se requiere el boxeo como métodos de la intlist vuelven tipos primitivos, no enteros.

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