2009-02-16 6 views

Antwort

46

(update) Eigentlich - es gibt ein Szenario, in dem das for Konstrukt effizienter ist; Schleife auf einem Array. Der Compiler/JIT-Optimierungen für dieses Szenario hat , solange Siearr.Lengthin der Bedingung verwenden:

for(int i = 0 ; i < arr.Length ; i++) { 
    Console.WriteLine(arr[i]); // skips bounds check 
} 

In diesem speziellen Fall ist, überspringt sie die Grenzen überprüft, wie es bereits weiß, dass es nie außerhalb der Grenzen sein. Interessanterweise, wenn Sie „Hubwerk“ arr.Length zu versuchen, es manuell zu optimieren, können Sie verhindern, dass dies passiert:

int len = arr.Length; 
for(int i = 0 ; i < len ; i++) { 
    Console.WriteLine(arr[i]); // performs bounds check 
} 

jedoch mit anderen Behältern (List<T> usw.), ist Hebes recht vernünftig als manuelle Mikro-Optimierung.

(Ende Update)


Weder; Eine for-Schleife wird sowieso als While-Schleife unter der Haube ausgewertet.

Zum Beispiel 12.3.3.9 von ECMA 334 (eindeutige Zuordnung) schreibt vor, dass eine for-Schleife:

for (for-initializer ; for-condition ; for-iterator) embedded-statement 

wesentlichen äquivalent ist (von einem Definite Zuordnung Perspektive (nicht ganz dasselbe wie Sprechen „des Compilers diese IL ")), wie müssen erzeugen:

{ 
    for-initializer ; 
    while (for-condition) { 
     embedded-statement ; 
     LLoop: 
     for-iterator ; 
    } 
} 

mit Aussagen weiterhin die die für Anweisung Ziel wird übersetzt Goto-Anweisungen für das Label LLoop. Wenn die For-Bedingung aus der For-Anweisung weggelassen wird, dann Auswertung der definitiven Zuordnung geht weiter, als ob For-Bedingung mit True in der obigen Erweiterung ersetzt wurden.

Nun, dies bedeutet nicht, dass der Compiler genau die gleiche Sache zu tun hat, aber es ist ziemlich viel kostet ...

+0

Können Sie Quellen und Zitate für die Optimierung der Hebepausen angeben? – Krythic

+0

@Krythic ist gerade über dieses gestolpert: https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/blogpost von Jon Skeet. – NoxMortem

+0

NoxMortem Danke – Krythic

2

Keiner in der Realität. Sie sind gleichwertig. Sie können sich vorstellen, dass die 'for' -Schleife eine kompaktere Art ist, die while-Schleife zu schreiben.

12

Ich würde sagen, sie sind die gleichen und Sie sollten solche Mikro-Optimierungen sowieso nie machen.

-1

Ja, sie sind gleichwertige Code-Schnipsel.

6

Die Leistung wird gleich sein. Wenn Sie jedoch nicht auf die Variable i außerhalb der Schleife zugreifen müssen, sollten Sie die Schleife for verwenden. Dies wird sauberer sein, da i nur einen Bereich innerhalb des Blocks haben wird.

3

Programm-Effizienz kommt von richtigen Algorithmen, gutem Objektdesign, intelligenter Programmarchitektur usw.

Wenn Sie einen oder zwei Zyklen mit for loops vs while loops bearbeiten, wird NIEMALS ein langsames Programm schnell oder ein schnelles Programm langsam gemacht.

Wenn Sie die Programmleistung in diesem Abschnitt verbessern möchten, finden Sie eine Möglichkeit, die Schleife teilweise zu entrollen (siehe Duff's Device), oder verbessern Sie die Leistung dessen, was innerhalb der Schleife getan wird.