Variablendefinition

Status
Nicht offen für weitere Antworten.
B

bygones

Gast
Hi,

macht es eigentlich einen signifikanten unterschied wenn Variablen wie folgt definiert werden

Code:
String s;
while(eineSehrLangeSchleife) {
 s = "Was auch immer, kann unterschiedlich sein"; // also nicht immer der gleiche Inhalt
// mach was mit Variable s
}

zu

Code:
while(eineSehrLangeSchleife) {
String s = "Was auch immer, kann unterschiedlich sein"; // also nicht immer der gleiche Inhalt
// mach was mit s
}

thx
 

L-ectron-X

Gesperrter Benutzer
Moin deathbyaclown,

Deklaration mit anschließender Definition dürften sich im Gegensatz zur sofortigen Initialisierung von der Performance her nichts nehmen. Die Variable benötigt so oder so Platz im Speicher, ganz gleich, wann die Wertzuweisung erfolgt. Dass es dahingehend zu Performance-Unterschieden kommt, kann ich mir nicht vorstellen.
In deiner zweiten Variante wird die Referenz-Variable nur schon nach verlassen der while-Schleife zerstört. Und nach Methodenbeendigung wird der Stack sofort abgeräumt.

Grüße.
L-ectron-X
 

timomeinen

Aktives Mitglied
In der IX war ein Bericht über Performancesteigerungen mit Hilfe des Garbage Collectors. Demnach war es sinnvoller, die erste Variante zu nehmen, obwohl die Zweite die "objektorientiert-technisch-gesehen" korrektere war.

Falls es interessiert suche ich gerne noch mal nach dem Artikel.
 

timomeinen

Aktives Mitglied
Ja mache ich. Bin jetzt allerdings am WE nicht zu Hause, werde es also am Montag nachreichen.

Hier der Artikelname:

1. Michael K. Klemke (ka)
Abfallwirtschaft
Den Garbage Collector der JVM richtig nutzen
wissen
iX 4/05, Seite 102

Falls jemand in seinem iX-Archiv suchen möchte. ;-)
 

Icewind

Bekanntes Mitglied
bei der zweiten variante wärs doch so das er bei jedem schleifendurchlauf eine neue referenz erstellt oder?? also wär der unterschied ein, wenn auch sehr geringer, im speicherbedarf oder??
 

KISS

Bekanntes Mitglied
in beiden beispielen wird ein das selbe literal immer wieder referenziert. da es sich um ein literal handelt, sollten beide besipiele keinen unterschied machen, solange mit der referenz nicht wietergearbeitet wird. der einzige unterschied ist der scope der variablen und damit die aufloesung fuer den gc.
 

Reality

Top Contributor
Ist es eigentlich sinnvoll, nicht mehr genutzte Objekte null zu initialisieren?

Bei Variante 1 könnte man ja das machen.

Liebe Grüße
Reality
 

KISS

Bekanntes Mitglied
jain,
da man in java die scopes sowieso klein halten sollte (und daher lange methoden und riesige klassen zwar kein beweis aber ein gutes indiz fuer schlechten stil sind), sollte es garnicht noetig sein. zudem laeuft der gc nun auch nicht sooo oft los (ausser man arbeitet hart an der grenze des zur verfuegung stehenden speichers). fuer die, die es immer noch nicht begriffen haben und alle variablen im "methodenkopf" oder gar als member deklarieren, ja, sollte man expizit auf null setzten, und anschliessend ein buch lesen.
 
B

Beni

Gast
@Reality

null-Referenzen können die Arbeit des GC's vielleicht ein bisschen vereinfachen, aber damit gewinnt man wahrscheinlich nur ein paar Mikrosekunden.
Aber wenn du oft Variablen auf null setzt, ist die Chance unbeabsichtigt ein Speicherloch zu kreiren kleiner (Du könntest ja irgendwo immerwieder neue Objekte herstellen, und durch deine Variablen entsteht sowas wie eine verkettete Liste -> es wird nie ein Objekt gelöscht).
 
Status
Nicht offen für weitere Antworten.

Oben