Java (Laufzeit): Wiederholter Methodenaufruf oder Zwischenspeichern?

...komplette Frage anzeigen

3 Antworten

Es sei dazugesagt, dass in der Methode getAttr() nichts weiter passiert, als den Attributwert zurückzugeben (return attr).

Nun könnte es aber durchaus sein dass es später mal eine abgeleitete Klasse gibt welche die Methode getAttr() überschreibt und dabei dann auch noch einen Seiteneffekt auslöst (z.B. "Hello world" ausgibt wenn getAttr() aufgerufen wird)

Da die JVM auch zur Laufzeit dynamisch Klassen laden kann darf der Compiler den mehrfachen Aufruf von getAttr() also nicht einfach wegoptimieren..

getAttr() nur einmal aufzurufen und das Ergebnis dann zwischenzuspeichern darf der Compiler aber auch aus einem anderen Grund nicht.
Es könnte ja sein, dass es einen Nebenthread gibt der den Wert von attr verändert und das der Hauptthread deswegen wiederholt getAttr() aufruft um diese Änderung mitzubekommen.
Würde der Compiler den Aufruf nur einmal durchführen und das Ergebnis lokal speichern würde sich dieses zwischengespeicherte Ergebnis ja nie ändern - auch wenn die Variable deren Wert getAttr() zurückliefert zwischenzeitlich durch einen anderen Thread geändert worden ist.

Alternativ könnte der Wert des Attributs auch innerhalb des einzigen Threads z.B. per Reflection geändert werden (was der Compiler im Detail nicht mehr nachvollziehen kann).
Auch dann würde so eine automatische Optimierung durch den Compiler den Algorithmus unzulässig verändern

Von daher - wenn Du das optimieren willst dann mußt Du die Optimierung wie von Dir beschrieben selbst durchführen....

Falls es sich um AbstractMetaDataHandler::getAttr(org.xml.sax.Attributes attrs, java.lang.String key) 

handelt, ist es definitiv besser den Wert zwischen zu speichern. Auch bei ähnlichen Methoden mit dem gleichen Namen ist es wahrscheinlich, dass über eine Collection iteriert werden muss und das dauert länger als einen Wert aus einer Variablen zu nehmen.

Oder getAttr gibt die Klassenvariable attr zurück. Dann ist es von der Geschwindigkeit her völlig egal ob man o.getAttr() mehrfach aufruft oder den Wert zwischenspeichert. Vom Arbeitsspeicher her würde das Zwischenspeichern entsprechend des Datentyps eben mehr benötigen. 

crizeo 05.05.2016, 14:32

Nein, diese Methode habe ich frei erfunden, sie heißt bei mir anders. Aber angenommen ich habe das Konzept einer for-Schleife, in der ich die Bedingung "i < o.getAttribut()" habe. Sollte ich das Attribut dann zwischenspeichern?

0
Spirit528 05.05.2016, 14:33
@crizeo

Ich weiß noch immer nicht, was in getAttr() oder getAttribute() steht. Wenn es nur eine Klassenvariable zurück gibt, dann muss man es nicht zwischenspeichern.

0
crizeo 05.05.2016, 14:50
@Spirit528

Wie gesagt, es wird nur "return attr" ausgeführt.

0

Das ist vollkommen egal.

Was möchtest Du wissen?