Laden...

Variablendeklaration in oder vor der Schleife?

Erstellt von Christoph K. vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.349 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 15 Jahren
Variablendeklaration in oder vor der Schleife?

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 ?

J
237 Beiträge seit 2008
vor 15 Jahren

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.

5.742 Beiträge seit 2007
vor 15 Jahren

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.

S
8.746 Beiträge seit 2005
vor 15 Jahren

Klar Empfehlung: Innerhalb der Schleife.

Zwei Gründe:

  1. Refactoring wird leichter
  2. Keine Probleme bei automatischen Schleifenparallelisierungen

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.

1.002 Beiträge seit 2007
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

das hat mit dem stack zu tun. wenn er innerhalb der schleife ist, dann kann er einfach oben auf dem stack was draufklatschen und fertig. wenn er außerhalb der schleife ist, muss er immer erst die entsprechende position im stack freischaufeln.

M
1.439 Beiträge seit 2005
vor 15 Jahren

@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.

Gelöschter Account
vor 15 Jahren

das ist mir schon klar nur ist der platz, wo es liegt ein anderer und eben das ist der unterschied. aber wie erwähnt beherrscht der JIT-compiler diese optimierung bereits.

M
1.439 Beiträge seit 2005
vor 15 Jahren

Wieso sollte der Platz ein anderer sein? Vermutlich wird die Variable sowieso weg optimiert und nur in einem Register gehalten.

Gelöschter Account
vor 15 Jahren

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.

M
1.439 Beiträge seit 2005
vor 15 Jahren

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.

Gelöschter Account
vor 15 Jahren

das ist mir klar, nur ist hier performancetechnisch wichtig, an welcher position welche referenz bzw welcher wert zu finden ist.

49.485 Beiträge seit 2005
vor 15 Jahren

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

S
8.746 Beiträge seit 2005
vor 15 Jahren

Außerhalb der Schleife?
m0rius

Sorry, Verdreher. Innerhalb war gemeint.