nehmen wir an, ich brauche in einer for-schleife eine temporäre variable, welche jedoch nur im aktuellen durchlauf benutzt wird, ungefähr so:
for(i=0;i<10;i++)
{
string temp = GetTheValue(i);
...
}
Sollte ich dann eher
string temp;
for(i=0;i<10;i++)
{
temp = GetTheValue(i);
...
}
oder
for(i=0;i<10;i++)
{
string temp = GetTheValue(i);
...
}
schreiben ?
Das wurde auch schon im Forum diskutiert (-> Suche einfach mal).
Im Prinzip ist es egal.
Grüße, JasonDelife.
Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.
Hallo meisteralex,
in Kurzform: Es gibt eine Regel, dass man Variablen so dicht an ihrer Verwendungsstelle wie möglich deklariert.
Daher eher Variante 2.
Aber ansonsten verhält es sich so, wie JasonDelife sagt: Geschmackssache.
Klar Empfehlung: Innerhalb der Schleife.
Zwei Gründe:
Aus Performance-Sicht optimiert der JIT das schon heutige zu gleichwertigem Code. Früher hätte die Deklaration außerhalb der Schleife noch zu Performanceverlust geführt.
Hallo svenson,
Früher hätte die Deklaration außerhalb der Schleife noch zu Performanceverlust geführt.
Außerhalb der Schleife? Entsteht der Performanceverlust nicht dadurch, dass innerhalb der Schleife ständig eine neue Variable deklariert wird?
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
@m0rius & JAck30lena:
Auf dem Stack wird nur 1 mal Platz für die lokale Variable temp reserviert, egal ob die Variable innerhalb oder außerhalb der Schleife deklariert wird.
Wieso sollte der Platz ein anderer sein? Vermutlich wird die Variable sowieso weg optimiert und nur in einem Register gehalten.
wie bereits und nochmals erwähnt beherrscht der JIT-Compiler diese optimierung.
zu .net 1.0 zeiten wurde im falle von instanzanlegung außerhalb zuerst die temp variable und dann die i variable angelegt. nun musst er im schleifendurchlauf jedesmal die i-variable parken um an die tempvariable zu kommen.
edit: zumindest hab ich das damals so verstanden.
Dein Verständnis vom Stack ist etwas falsch. Um eine Variable zu lesen, muss der Compiler kein Push/Pop einfügen. Dein Programm kann wahlfrei auf sämtliche Stackpositionen zugreifen, da der Stack ja auch nur im normalen Arbeitsspeicher liegt.
Edit: Ok, du meinst den Evaluation Stack, da arbeitet man mit load and pop. Aber natürlich wird dieser zur Laufzeit in entsprechenden Maschinencode umgewandelt.
Hallo JAck30lena,
nur ist hier performancetechnisch wichtig
es mag sein, dass ein gewisser Einfluss auf die Performance bestand, nur war dieser höchstens in praktisch irrelevanten Ausnahmefällen überhaupt spürbar. Daher finde ich die Aussage "performancetechnisch wichtig" völlig unhaltbar. Der etwaige Performance-Unterschied spielt hierbei praktisch keine Rolle und hat das auch noch nie gespielt. Optimierung hin oder her.
Davon abgesehen: Der Speicher für lokale Variablen wird immer schon beim Aufruf der Methode reserviert. Egal wo die lokalen Variablen innerhalb der Methode deklariert sind.
herbivore
Außerhalb der Schleife?
m0rius
Sorry, Verdreher. Innerhalb war gemeint.