440 Stimmen

Welche Schleife in .NET läuft schneller, "for" oder "foreach"?

In C#/VB.NET/.NET, welche Schleife läuft schneller, for o foreach ?

Seitdem ich gelesen habe, dass ein for Schleife arbeitet schneller als eine foreach Schleife a vor langer Zeit Ich nahm an, dass dies für alle Sammlungen, generischen Sammlungen, alle Arrays usw. gilt.

Ich habe Google durchforstet und einige Artikel gefunden, aber die meisten davon sind nicht schlüssig (lesen Sie die Kommentare zu den Artikeln) und haben ein offenes Ende.

Ideal wäre es, jedes Szenario aufzulisten und die beste Lösung dafür zu nennen.

Ein Beispiel (nur ein Beispiel dafür, wie es sein sollte):

  1. für die Iteration eines Arrays von 1000+ Zeichenketten - for ist besser als foreach
  2. zur Iteration über IList (nicht generische) Zeichenketten - foreach ist besser als for

Ein paar Referenzen im Internet für das gleiche gefunden:

  1. Ursprünglicher großer alter Artikel von Emmanuel Schanzer
  2. CodeProject FOREACH Vs. FOR
  3. Blog - Zum foreach oder nicht foreach das ist die Frage
  4. ASP.NET Forum - NET 1.1 C# for vs foreach

[Bearbeiten]

Abgesehen vom Aspekt der Lesbarkeit bin ich wirklich an Fakten und Zahlen interessiert. Es gibt Anwendungen, bei denen es auf die letzte Meile der Leistungsoptimierung ankommt.

38voto

Brian Rasmussen Punkte 112118

Ich vermute, dass dies in 99 % der Fälle nicht von Bedeutung sein wird. Warum sollten Sie also die schnellere statt der am besten geeigneten (d. h. am einfachsten zu verstehenden/zu wartenden) Lösung wählen?

34voto

T.E.D. Punkte 42630

Es gibt sehr gute Gründe dafür lieber foreach Schleifen über for Schleifen. Wenn Sie eine foreach Schleife, hat Ihr Chef Recht, dass Sie das tun sollten.

Aber nicht jede Iteration besteht darin, eine Liste der Reihe nach durchzugehen. Wenn er Verbot denn, ja, das ist falsch.

Wenn ich Sie wäre, würde ich Folgendes tun alle natürlichen for-Schleifen in Rekursionen umwandeln . Das würde ihm eine Lehre sein, und es ist auch eine gute mentale Übung für Sie.

32voto

Greg Hewgill Punkte 882617

Es ist unwahrscheinlich, dass es einen großen Leistungsunterschied zwischen den beiden gibt. Wie immer, wenn Sie mit der Frage "Was ist schneller?" konfrontiert werden, sollten Sie immer denken: "Ich kann das messen."

Schreiben Sie zwei Schleifen, die im Schleifenkörper das Gleiche tun, führen Sie beide aus und messen Sie die Zeit, die sie benötigen, um den Geschwindigkeitsunterschied festzustellen. Machen Sie dies sowohl mit einem fast leeren Schleifenkörper als auch mit einem Schleifenkörper, der dem entspricht, was Sie tatsächlich tun werden. Probieren Sie es auch mit dem von Ihnen verwendeten Auflistungstyp aus, da verschiedene Auflistungstypen unterschiedliche Leistungsmerkmale aufweisen können.

21voto

Max Toro Punkte 27760

Jeffrey Richter auf der TechEd 2005:

"Ich habe im Laufe der Jahre gelernt, dass der C#-Compiler im Grunde genommen ein Lügner ist." ... "Er lügt bei vielen Dingen." ... "Wenn man z.B. eine foreach-Schleife macht..." ... "...das ist eine kleine Codezeile, die man schreibt, aber was der C#-Compiler dafür ausspuckt, ist phänomenal. Er setzt einen try/finally-Block ein, innerhalb des finally-Blocks wird die Variable in eine IDisposable-Schnittstelle umgewandelt, und wenn die Umwandlung erfolgreich war, wird die Dispose-Methode aufgerufen, innerhalb der Schleife werden die Current-Eigenschaft und die MoveNext-Methode wiederholt innerhalb der Schleife aufgerufen, Objekte werden im Verborgenen erstellt. Viele Leute benutzen foreach, weil es sehr einfach zu kodieren ist, sehr einfach zu machen..." ... "foreach ist nicht sehr leistungsfähig, wenn man stattdessen über eine Sammlung iteriert, indem man die Notation in eckigen Klammern verwendet und einfach einen Index macht, ist das viel schneller und es werden keine Objekte auf dem Heap erzeugt..."

Webcast auf Abruf: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032292286&EventCategory=3&culture=en-US&CountryCode=US

14voto

Or Yaacov Punkte 3204

Können Sie darüber lesen in Deep .NET - Teil 1 Iteration

Es deckt die Ergebnisse (ohne die erste Initialisierung) vom .NET-Quellcode bis zur Disassemblierung ab.

zum Beispiel - Array Iteration mit einer foreach-Schleife: enter image description here

und - Listeniteration mit foreach-Schleife: enter image description here

und die Endergebnisse: enter image description here

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X