105 Stimmen

Leistungsunterschiede bei den Kontrollstrukturen 'for' und 'foreach' in C#

Welcher Codeschnipsel bringt eine bessere Leistung? Die folgenden Codesegmente wurden in C# geschrieben.

1.

for(int tempCount=0;tempCount<list.count;tempcount++)
{
    if(list[tempCount].value==value)
    {
        // Some code.
    }
}

foreach(object row in list)
{
    if(row.value==value)
    {
        //Some coding
    }
}

2voto

ThunderGr Punkte 2199

Nachdem ich genug Argumente gelesen habe, dass "die foreach-Schleife aus Gründen der Lesbarkeit vorzuziehen ist", kann ich sagen, dass meine erste Reaktion "was" war. Die Lesbarkeit ist im Allgemeinen subjektiv und in diesem speziellen Fall sogar noch mehr. Für jemanden mit einem Hintergrund in der Programmierung (praktisch jede Sprache vor Java) sind for-Schleifen viel einfacher zu lesen als foreach-Schleifen. Darüber hinaus sind dieselben Leute, die behaupten, dass foreach-Schleifen besser lesbar sind, auch Befürworter von linq und anderen "Funktionen", die das Lesen und Warten von Code erschweren, was den obigen Punkt bestätigt.

Zu den Auswirkungen auf die Leistung siehe die Antwort auf diese Frage.

EDIT: Es gibt Sammlungen in C# (wie das HashSet), die keinen Indexer haben. In diesen Sammlungen, foreach ist die einzige Möglichkeit, zu iterieren, und das ist der einzige Fall, in dem ich denke, dass es über für .

0voto

Sam Punkte 1239

Es gibt noch eine weitere interessante Tatsache, die leicht übersehen werden kann, wenn man die Geschwindigkeit der beiden Schleifen testet: Die Verwendung des Debug-Modus lässt den Compiler den Code nicht mit den Standardeinstellungen optimieren.

Dies führte mich zu dem interessanten Ergebnis, dass foreach schneller ist als for im Debug-Modus. Im Freigabemodus hingegen ist for schneller als foreach. Offensichtlich hat der Compiler bessere Möglichkeiten, eine for-Schleife zu optimieren als eine foreach-Schleife, die mehrere Methodenaufrufe kompromittiert. Eine for-Schleife ist übrigens so grundlegend, dass es möglich ist, dass diese sogar von der CPU selbst optimiert wird.

0voto

rpax Punkte 4373

In dem von Ihnen angeführten Beispiel ist es definitiv besser, die foreach Schleife stattdessen eine for Schleife.

Die Norm foreach Konstrukt kann schneller sein (1,5 Zyklen pro Schritt) als eine einfache for-loop (2 Zyklen pro Schritt), es sei denn, die Schleife wurde abgerollt (1,0 Zyklen pro Schritt).

Für alltäglichen Code ist die Leistung also kein Grund, die komplexere for , while o do-while Konstrukte.

Sehen Sie sich diesen Link an: http://www.codeproject.com/Articles/146797/Fast-and-Less-Fast-Loops-in-C


        Method         List<int>  int[]  Ilist<int> onList<Int>  Ilist<int> on int[] 

 Time (ms)             23,80      17,56  92,33                   86,90               
 Transfer rate (GB/s)  2,82       3,82   0,73                    0,77                
 % Max                 25,2%      34,1%  6,5%                    6,9%                
 Cycles / read         3,97       2,93   15,41                   14,50               
 Reads / iteration     16         16     16                      16                  
 Cycles / iteration    63,5       46,9   246,5                   232,0               

0voto

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 - Listen-Iteration 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