Ein häufiges Dilemma, mit dem ich während der Programmierung konfrontiert wurde, betrifft die Deklaration von Variablen innerhalb einer Schleife. Angenommen, ich muss etwas wie folgt ausführen:
%Vor% Sollte myBo
im obigen Snippet außerhalb der Schleife deklariert werden oder deklariert es innerhalb der Schleife nicht zu Schäden an Speicher und Leistung?
myBo
ist einfach eine Referenz auf ein Objekt (das von itr.next () zurückgegeben wird). Daher ist die Menge an Speicher, die benötigt wird, sehr klein und wird nur einmal erstellt, und das Hinzufügen innerhalb der Schleife sollte Ihr Programm nicht beeinträchtigen. IMO, erklärt es innerhalb der Schleife, wo es verwendet wird, tatsächlich hilft es lesbarer zu machen.
Wenn Sie es in der Schleife deklarieren, wird der Speicher und die Leistung nicht beeinträchtigt.
Ein Grundsatz guten Software-Designs besteht darin, den Umfang lokaler Variablen zu begrenzen, d. h. sie zeitlich genau innerhalb eines Blocks zu deklarieren, der kurz nach der letzten Verwendung dieser Variablen endet. Dies wirkt sich nicht auf die Leistung oder andere "harte" Aspekte aus, macht das Programm jedoch lesbarer und einfacher zu analysieren.
Alles in allem ist das, was du tust, GUT.
Die eleganteste Lösung für Ihre Schleife wäre eine erweiterte for-Schleife (Java 5 oder neuer):
%Vor%Aber selbst mit dem von Ihnen bereitgestellten Code wird kein Leistungsproblem auftreten, da alle temporären Variablen nur Referenzen auf das BusinessObject enthalten, was sehr billig ist.
Wenn kurz - nein.
In C ++ könnte es ein Problem sein, wenn myBo durch Kopieren erstellt wird
aber in Java gibt es immer Referenzen, nicht wahr?
für die Leistung ist es besser, etwas zu optimieren, was Sie tun (
Sehen Sie sich den Byte-Code mit javap -c [ClassName]
an. Hier ist eine Klasse, die einige Beispiele von Variablen für den Einmalgebrauch mit Schleifen zeigt. Der relevante Bytecode-Dump ist in den Kommentaren:
stringDeclaredInsideLoop()
und stringDeclaredOutsideLoop()
ergeben einen identischen Sechs-Befehls-Bytecode. stringDeclaredInsideLoop()
gewinnt immer noch: begrenzter Bereich ist am besten .
Nach einigem Nachdenken kann ich nicht wirklich sehen, wie ein enger werdender Umfang jemals die Leistung beeinflussen würde: identische Daten im Stapel würden identische Anweisungen erfordern.
stringAsDirectArgument()
definiert jedoch die Operation in nur vier Anweisungen. Geringe Speicherumgebungen (z. B. mein prächtig dummes Telefon) mögen die Optimierung zu schätzen wissen, während ein Kollege, der Ihren Code liest, dies möglicherweise nicht tut, also üben Sie ein Urteil, bevor Sie Bytes aus Ihrem Code rasieren.
Weitere Informationen finden Sie in der vollständigen Liste .
Tags und Links java