Domanda

Ho una abbastanza costoso calcolo array (SpectralResponse) che mi piace mantenere al minimo. Ho pensato che il modo migliore è per memorizzarli e riportarlo su quando è necessario un nuovo stesso array in futuro. La decisione è presa utilizzando BasicParameters.

Quindi, in questo momento, io uso un LinkedList di oggetto per gli array di SpectralResponse, e un altro per il LinkedList BasicParameter. E i BasicParameters ha un metodo isParamsEqualTo (BasicParameters) per confrontare il set di parametri.

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

Quindi, per guardare in alto, mi basta andare attraverso la lista di BasicParameters, verificare la presenza di partita, se abbinati, restituire lo SpectralResponse. Se nessuna corrispondenza, quindi calcolare lo SpectralResponse.

Ecco è il ciclo che ho usato per ricerca.

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);
            }
        }
    }

Ma in qualche modo, facendo in questo modo non solo prendere fuori un sacco di memoria, in realtà è più lento di solo calcolo SpectralResponse dritto. Molto più lento.

Così è la mia implementazione che è sbagliato, o mi sono sbagliato che il ricalcolo e la ricerca è più veloce?

È stato utile?

Soluzione

Si accede a un LinkedList per indice, questo è il modo peggiore possibile per accedervi;)

Si dovrebbe usare ArrayList invece, o utilizzare gli iteratori per tutte le liste.

Forse si dovrebbe unire i tre oggetti in uno, e tenerli in una mappa con responseNum come chiave.

Spero che questo aiuti!

Altri suggerimenti

Probabilmente si dovrebbe usare un tipo di matrice (una matrice reale, come vettore, ArrayList), le liste non collegate. Le liste concatenate è meglio per lo stack o il funzionamento della coda, non indicizzare (poiché è necessario attraversare da un capo). Vector è un allineamento automatico ridimensionamento, che vanta meno overhead di accesso inexes.

I get (i) i metodi di LinkedList richiedono che per recuperare ogni elemento che deve andare oltre e più lungo l'elenco. Considerare l'utilizzo di un ArrayList, il metodo iterator (), o semplicemente un array.

La seconda linea, 'if (responseNumbers.get(i) == responseNum)' sarà anche inefficiente come il responseNumbers.get(i) è un numero intero, e deve essere unboxing ad un int (Java 5 in poi lo fa automaticamente, il codice non compilato su Java 1.4 o prima se responseNum è dichiarato come un int). Vedere questo per ulteriori informazioni sulla boxe.

Per rimuovere questo overhead unboxing, utilizzare un IntList dalla libreria primitive apache. Questa libreria contiene collezioni che memorizzano gli oggetti sottostanti (INT nel suo caso) come matrice primitiva (ad esempio int []) invece di un array oggetto. Ciò significa che non è richiesta la boxe come metodi del IntList restituiscono tipi primitivi, non interi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top