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.

8voto

Ken Punkte 437

"Gibt es irgendwelche Argumente, mit denen ich ihn überzeugen kann, dass die for-Schleife akzeptabel ist?"

Nein, wenn Ihr Chef Ihnen vorschreibt, welche Konstrukte der Programmiersprache Sie verwenden sollen, können Sie wirklich nichts sagen. Entschuldigung.

7voto

Andrew Kennan Punkte 13537

Es hängt wahrscheinlich von der Art der Sammlung ab, die Sie aufzählen, und von der Implementierung des Indexers. Im Allgemeinen wird jedoch die Verwendung von foreach ist wahrscheinlich ein besserer Ansatz.

Außerdem funktioniert es mit jedem IEnumerable - nicht nur Dinge mit Indexern.

7voto

Reed Copsey Punkte 536986

Jedes Sprachkonstrukt hat eine bestimmte Zeit und einen bestimmten Ort für die Verwendung. Es gibt einen Grund, warum die Sprache C# vier separate Iterationsanweisungen - jede ist für einen bestimmten Zweck da und hat eine angemessene Verwendung.

Ich empfehle, sich mit Ihrem Chef zusammenzusetzen und zu versuchen, rational zu erklären, warum eine for Schleife hat einen Zweck. Es gibt Zeiten, in denen eine for Iterationsblock beschreibt einen Algorithmus deutlicher als ein foreach Iteration. Wenn dies der Fall ist, ist es angebracht, sie zu verwenden.

Ich würde Ihren Chef auch darauf hinweisen, dass Leistung in praktischer Hinsicht kein Thema ist und auch nicht sein sollte - es geht eher darum, den Algorithmus in einer knappen, aussagekräftigen und wartbaren Weise auszudrücken. Mikro-Optimierungen wie diese gehen völlig am Sinn der Leistungsoptimierung vorbei, da ein echter Leistungsvorteil aus der Umgestaltung des Algorithmus und dem Refactoring resultiert, nicht aus der Umstrukturierung von Schleifen.

Wenn es nach einer vernünftigen Diskussion immer noch diese autoritäre Ansicht gibt, liegt es an Ihnen, wie Sie weiter vorgehen. Ich persönlich wäre nicht glücklich darüber, in einem Umfeld zu arbeiten, in dem rationales Denken unterbunden wird, und würde in Erwägung ziehen, eine andere Stelle bei einem anderen Arbeitgeber anzutreten. Ich empfehle jedoch dringend eine Diskussion, bevor man sich aufregt - vielleicht liegt einfach nur ein Missverständnis vor.

6voto

Brian Rasmussen Punkte 112118

Ob for ist schneller als foreach ist wirklich nicht der Rede wert. Ich bezweifle ernsthaft, dass die Entscheidung für das eine oder das andere einen signifikanten Einfluss auf Ihre Leistung haben wird.

Der beste Weg zur Optimierung Ihrer Anwendung ist die Profilerstellung für den eigentlichen Code. Dadurch werden die Methoden ermittelt, die die meiste Arbeit/Zeit verursachen. Optimieren Sie diese zuerst. Wenn die Leistung immer noch nicht akzeptabel ist, wiederholen Sie das Verfahren.

Generell würde ich empfehlen, sich von Mikro-Optimierungen fernzuhalten, da sie nur selten signifikante Vorteile bringen. Die einzige Ausnahme ist die Optimierung identifizierter heißer Pfade (d.h. wenn Ihr Profiling einige stark genutzte Methoden identifiziert, kann es sinnvoll sein, diese ausgiebig zu optimieren).

5voto

Martin Wickman Punkte 19017

Es ist das, was Sie tun innerhalb die Schleife, die die Leistung beeinträchtigt, und nicht das eigentliche Schleifenkonstrukt (vorausgesetzt, Ihr Fall ist nicht trivial).

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