Variablendeklaration innerhalb einer Schleife

8

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?

    
Amit 05.01.2010, 08:59
quelle

9 Antworten

4

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.

    
MAK 05.01.2010, 09:05
quelle
8

Wenn Sie es in der Schleife deklarieren, wird der Speicher und die Leistung nicht beeinträchtigt.

    
missingfaktor 05.01.2010 09:01
quelle
5

Wenn möglich, verwenden Sie List<BusinessObject> und Iterator<BusinessObject> , um das Casting zu vermeiden:

%Vor%     
cyborg 05.01.2010 09:01
quelle
5

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.

    
Carl Smotricz 05.01.2010 09:05
quelle
4

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.

    
tangens 05.01.2010 09:24
quelle
2

Es verursacht keinen Speicherschaden.

Übrigens, wenn Sie keinen Code weglassen, können Sie die Deklaration ganz überspringen:

%Vor%     
OscarRyz 05.01.2010 09:31
quelle
1

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 (

)     
user204724 05.01.2010 09:08
quelle
1

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:

%Vor%

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 .

    
fny 10.09.2012 22:39
quelle
0

Die temporäre Referenz myBo wird auf den Stack gelegt und sollte meistens weg optimiert werden. Es sollte keine Leistungseinbußen in Ihrem Code geben.

    
bryantsai 05.01.2010 09:22
quelle

Tags und Links