Frage von crizeo, 20

Java (Laufzeit): Wiederholter Methodenaufruf oder Zwischenspeichern?

Hallo,

ich habe hier eine Methode, welche als Parameter ein Objekt übergeben bekommt. Nun benötige ich von diesem Objekt o den Wert eines Attributs, welchen ich über die Methode o.getAttr() erhalte. Diese Methode wird wiederholt (d. h. ca. 5-10 mal) aufgerufen, da ich den Attributwert entsprechend oft benötige.

Meine Frage: Ist es sinnvoller, diesen Attributwert in einer lokalen Variable zwischenzuspeichern (und damit die Methode nur einmal aufzurufen), oder erkennt das der Compiler und es ist somit nicht störend mehrmals denselben Methodenaufruf zu verwenden? Es sei dazugesagt, dass in der Methode getAttr() nichts weiter passiert, als den Attributwert zurückzugeben (return attr).

Natürlich gibt sich das nicht viel, aber das Zwischenspeichern würde ja theoretisch auch Arbeitsspeicher belegen. Zwar ist das minimal, aber geht es mir hier eher um einen Grundsatz, da ich mir diese Frage nun schon zig mal gestellt habe und es einfach gut wäre, hier mal zu wissen was "schöner" ist.

Vielen Dank!

Antwort
von Spirit528, 13

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. 

Kommentar von crizeo ,

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?

Kommentar von Spirit528 ,

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.

Kommentar von crizeo ,

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

Kommentar von Spirit528 ,

Ah ok, du meinst return this.attr;

Antwort
von MalNachgedacht, 2

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....

Antwort
von EightSix, 7

Das ist vollkommen egal.

Keine passende Antwort gefunden?

Fragen Sie die Community