Lokale Variablenzuweisung, um mehrere Umwandlungen zu vermeiden

7

In letzter Zeit wurde gefragt, ob es in Java eine gute Idee war, die Ergebnisse des Aufrufs eines Getters einer lokalen Variablen zuzuweisen, um mehrere Aufrufe desselben Accessors zu vermeiden. Ich kann den ursprünglichen Beitrag nicht finden, aber der Konsens scheint zu sein, dass dies im Allgemeinen nicht notwendig ist, da Hotspot sowieso den Methodenaufruf-Overhead optimieren wird.

Wie steht es jedoch mit dieser Technik, um mehrere Würfe zu vermeiden? Im Moment habe ich die Wahl zwischen:

%Vor%

ODER

%Vor%     
Adamski 17.09.2009, 11:05
quelle

8 Antworten

12

Gehen Sie auf jeden Fall mit dem ersten. Der Leistungsunterschied ist wahrscheinlich irrelevant, aber die Lesbarkeit ist definitiv verbessert.

Zusätzlich zum Entfernen der Umwandlungen bedeutet das auch, dass Sie einen anderen Namen verwenden müssen - schließlich wissen Sie jetzt mehr über diese Variable, daher kann es sinnvoll sein, ihr einen spezifischeren Namen zu geben. Das ist nicht immer der Fall, aber es kann sein. Die "lokale Variable einführen, um einen Wert zu nennen" ist eine unterschätzte Refraktortechnik, auch ohne die Umwandlungen ...

    
Jon Skeet 17.09.2009, 11:12
quelle
19

Ich bevorzuge es aus Gründen der Lesbarkeit lieber die lokale Variable als die Casting-Funktion zu erstellen. Code Lesbarkeit, für mich (oder andere Entwickler, die an dem gleichen Code arbeiten), ist ein wichtiges Thema.

Die Sorge um die Leistung in diesem Stadium erscheint mir als Beispiel für das Muster der "vorschnellen Optimierung".

    
SteveD 17.09.2009 11:12
quelle
3

Ich bevorzuge das erste, weil es sauberer aussieht. Die zweite sieht wie Lisp aus. Aber es ist nur eine persönliche Meinung.

    
João Silva 17.09.2009 11:09
quelle
3

Ich würde sagen, das Wichtigste ist, nicht vorzeitig zu optimieren. Wenn beim Gießen ein Overhead entsteht, ist dieser wahrscheinlich so klein, dass er in der Praxis kaum wahrgenommen wird. Wenn dieses Code-Snippet nicht den Großteil der CPU-Zeit Ihrer Anwendung ausmacht, denke ich nicht, dass Sie einen messbaren Leistungsunterschied zwischen den beiden sehen würden.

Folglich würde ich auch für die erste Option gehen, da sie sauberer aussieht und einfacher zu verstehen und zu modifizieren ist - viel wichtiger als ein paar Taktzyklen in 99,99% der Fälle schneller auszuführen.

    
Andrzej Doyle 17.09.2009 11:12
quelle
1

Absolut eine gute Idee, da es die Klarheit verbessert. Ich würde sagen, das gilt auch für die Vermeidung von mehreren Accessor-Anrufen - es ist eine gute Idee für die Klarheit und nicht für die Leistung.

    
Draemon 17.09.2009 11:12
quelle
1

Ich bevorzuge die erste Option, aus zwei Gründen

  1. Die notwendigen Klammern machen den Code cludgy und schwer zu lesen
  2. Es gibt möglicherweise einen (kleinen) Overhead in der Besetzung
Tor Haugen 17.09.2009 11:16
quelle
0

Ich bevorzuge die erste, nicht nur für die Codelesbarkeit, sondern für das Debugging der Laufzeit (auch für das ursprüngliche Beispiel - wenn Sie das Ergebnis des Getters in eine lokale setzen, sehen Sie diesen Wert, anstatt in den Getter zu verfolgen das erste Mal).

    
M1EK 17.09.2009 14:43
quelle
0

Ich stimme Leuten zu, die meinen, dass die erste Version vorzuziehen sei, aber ich würde gerne hinzufügen, dass wenn überhaupt möglich - und das ist fast immer möglich - Sie Casting vermeiden sollten. Nicht aus Performance-Gründen, sondern nur für die zusätzliche Überprüfung der Code-Korrektheit.

    
Steven Huwig 17.09.2009 14:54
quelle

Tags und Links