Objekttyp in schleife angeben oder außerhalb?

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
ich wollte wissen, ob es in sachen performance einen unterschied gibt zwischen

Code:
Iterator<String> it = ...
...
while(it.hasNext()) {
    String str = it.next();
    ...
}

und:

Code:
Iterator<String> it = ...
...
{
    String str;
    while(it.hasNext()) {
        str = it.next();
        ...
    }
}

(der Block soll nur zeigen, dass "str" nachher nicht mehr gebraucht wird.)

ich wollte wissen, ob in der ersten Variante zur Laufzeit jedes mal ein neues String-Objekt erzeugt wird, dies dann natürlich Zeit benötigt, weiters alte Objekte erst vom Garbage Collector gelöscht werden müssen, etc.
...oder ob dies vom Compiler/Interpreter erkannt wird und beide Varianten gleichwertig sind.

ich frage nur, weil solche Iterationen einfach ständig vorkommen und ich mal wissen wollte, welche Variante eigentlich üblich ist bzw. besser.
 

byte

Top Contributor
String ist hier ein blödes Beispiel, denn Strings sind immutable und werden afaik immer neu erzeugt. Also ähnlich wie bei den primitiven Typen. Davon mal abgesehen würde ich Variante 1 immer bevorzugen. Man sollte das Scope einer Variablen immer so klein halten wie möglich. Desweiteren sollte man bedenken, dass Object o; nur eine Referenz erzeugt, also einen Zeiger darstellt. Erst das o = new Object(); erzeugt das eigentliche Objekt im Speicher. Du lagerst in Variante 2 nur die Definition der Referenz aus. Das verbessert die Performance nicht.
 
B

Beni

Gast
In diesem Beispiel werden überhaupt keine Objekte erzeugt :wink:

Und Strings verhalten sich wie ganz normale Objekte, nur wenn sie direkt im Code (ala String x = "bubu") stehen, werden sie besonders behandelt.
 

-frank

Bekanntes Mitglied
okay, vielleicht war das beispiel schlecht gewählt. (klar werden hier keine objekte neu erzeugt, sondern nur referenzen gesetzt).

wie wärs mit:

Code:
for(int i =0; i < MAX_I; i++) {
    SomeObject o = new SomeObject(i);
    ...
}

vs.

Code:
SomneObject o:
for(int i =0; i < MAX_I; i++) {
    o = new SomeObject(i);
    ...
}

in variante 2 ist der scope größer als notwendig. dafür wäre zumindest für einen menschen gleich ersichtlich, dass kein neuer speicher allokiert werden muss. aber bringt dies in java irgendwas? eh nicht, oder? also "new Object()" erzeugt sowieso ein neues Object und erst die Garbage Collection löscht das alte. (direkt das alte Objekt überschreiben und den zeiger nicht neu setzen kann java nicht (?))
also brirnt es nichts, oder?
 
B

Beni

Gast
"new" erzeugt ein neues Objekt - immer. Wie und ob der Compiler oder der JIT das noch abändert, oder ob das sowieso zum selben Code compiliert wird - kann ich dir nicht sagen.

Aber solche Mirkooptimierungen sind sowieso Zeitverschwendung... ein Schleifendurchgang weniger, und du hast alles wieder aufgeholt :wink:
 

AlArenal

Top Contributor
Um Performance-Probleme sollte man sich kümmern, wenn man welche hat und die haben dann in der Regel mehr was mit miesen Algorithmen/Datenstrukturen zu tun.
Halte den Scope deiner Variablen so klein als möglich. Das macht den Code übersichtlicher, weil man nicht erst schauen muss, wo denn nun diese Variable wieder herkommt und gibt Ressourcen schneller für den Garbage Collector frei.
 

-frank

Bekanntes Mitglied
wäre es in meinem beispiel dann vermutlich am schnellsten, wenn ich auf "new SomeObject(i)" ganz verzichte (bzw. eben nur einmal ausführe) und dann ne methode wie reset(i) einführe, die ddas objekt neu initialisiert bzw. zurücksetzt. aber sowas wird man dann eben wirklich erst dann machen, wenn man die performance wirklich benötigt.

in meinem fall wollte ich wie gesagt nur mal wissen, wie man es generell macht. (also ich hab kein spezifisches problem, wo die performance ein problem wäre)

danke auf jeden fall!
 

Leroy42

Top Contributor
So wie AlArenal geschrieben hat.

Die Anweisung

Code:
String s;

innerhalb eines Code-Blocks erzeugt ja schließlich keinen Laufzeitaufwand und
erhöht nur den Stackzeiger.
 

SnooP

Top Contributor
Das reinitialisieren eines Objekts wird in der Regel nicht weniger komplex sein, als das neu erstellen mit new... - es sei denn der Konfigurationsaufwand mit dem Konstruktor ist deutlich höher als eine reset-Methode... das ist aber wirklich im Einzelfall zu entscheiden, ob das ganze Sinn macht.
Die Verwendung eines Profilers macht Sinn, wenn man tatsächlich Performanceprobleme feststellt... damit kann man dann tatsächlich feststellen welche Methoden Geschwindigkeit ziehen... und in den seltensten Fällen wird es messbare Verbesserungen durch oben angesprochene Dinge geben...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
N Frage zur while-Schleife Allgemeine Java-Themen 18
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
F Foreach und for - Schleife Allgemeine Java-Themen 10
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5
V Problem in While-Schleife Allgemeine Java-Themen 3
Escorter Switch in der Schleife! Allgemeine Java-Themen 4
C Auswertung der for each schleife? Allgemeine Java-Themen 2
GilbertGrape foreach Schleife Allgemeine Java-Themen 12
J FOR-Schleife-Problem Allgemeine Java-Themen 10
G Schleife durch Button beenden Allgemeine Java-Themen 6
S Schleife funktioniert nicht Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
R array.length in For-Schleife verwenden? Allgemeine Java-Themen 22
V Schleife funktioniert nicht wie gewünscht Allgemeine Java-Themen 5
T Schleife im Konstruktor? Allgemeine Java-Themen 9
S Schleife mit Durchlaufrate Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben