Frage

Ich habe eine ziemlich teure Feldberechnung (SpectralResponse), die ich auf ein Minimum halten mag. Ich dachte, der beste Weg, um sie zu speichern und bringen sie zurück, wenn gleiche Array in der Zukunft wieder benötigt wird. Die Entscheidung wird BasicParameters gemacht werden.

So jetzt, verwende ich eine LinkedList des Objekts für die Arrays von SpectralResponse, und einer anderen LinkedList für die BasicParameter. Und die BasicParameters hat eine isParamsEqualTo (BasicParameters) Methode den Parametersatz zu vergleichen.

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

So sehen, gehe ich einfach durch die Liste der BasicParameters, für Spiel überprüfen, wenn angepasst, geben Sie den SpectralResponse. Wenn keine Übereinstimmung, berechnet dann die SpectralResponse.

Hier ist die for-Schleife habe ich zum Nachschlagen.

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

Aber irgendwie, es auf diese Weise tun, nicht nur viel Speicher herausnehmen, es ist tatsächlich langsamer als nur SpectralResponse gerade berechnet wird. Viel langsamer.

So ist es meine Implementierung, die falsch ist, oder ich war falsch, dass Vorberechnung und Lookup schneller ist?

War es hilfreich?

Lösung

Sie sind ein LinkedList durch den Index zugreifen, ist dies die schlimmste Art und Weise, auf ihn zugreifen;)

Sie sollten Arraylist verwenden stattdessen oder verwenden Iteratoren für alle Ihre Listen.

Möglicherweise sollten Sie die drei Objekte zu einem verschmelzen und sie in einer Karte halten mit responseNum als Schlüssel.

Hope, das hilft!

Andere Tipps

Sie sollten wahrscheinlich einen Array-Typen (eine tatsächliche Anordnung, wie Vektor, Arraylist), nicht verlinkte Listen verwenden. Verkettete Listen sind am besten für Stapel oder Warteschlangenbetrieb, nicht die Indizierung (da Sie es von einem Ende zu durchlaufen haben). Vector ist ein Auto Redimensionierung Array, Wich hat weniger Overhead inexes Zugriff.

Die get (i) Methoden des LinkedList verlangen, dass jedes Element holen es weiter und weiter entlang der Liste zu gehen. Betrachten wir unter Verwendung eines Arraylist, den Iterator () Methode oder nur ein Array.

Die zweite Zeile, ‚if (responseNumbers.get(i) == responseNum)‘ wird auch ineffizient sein, da der responseNumbers.get(i) eine ganze Zahl ist, und hat in einem int unboxed sein (Java 5 ab tut dies automatisch, Ihr Code würde kompiliert nicht auf Java 1.4 oder früher, wenn responseNum ist als int deklariert). Siehe diese für weitere Informationen über Boxen.

Dieses Unboxing-Overhead zu entfernen, verwenden Sie ein IntList von der apache Primitiven Bibliothek. Diese Bibliothek enthält Sammlungen, die die zugrunde liegenden Objekte (Ints in Ihrem Fall) speichern als eine primitive Array (z int []) anstelle eines Object-Array. Dies bedeutet, dass keine Boxen erforderlich, da die IntList Methoden primitive Typen zurückgeben, nicht ganze Zahlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top