Ich weiß, dass es einen Unterschied zwischen den beiden gibt, aber ist einer von ihnen schneller als der andere? Ich denke, der zweite ist schneller.
Ja, die erste Version ist viel langsamer. Schließlich gehe ich davon aus, dass es sich um Typen wie diese handelt:
%Vor%Hier dauert Ihre erste Schleife ~ 10 Sekunden, während Ihre zweite Schleife ~ 1 Sekunde dauert.
Natürlich könnten Sie argumentieren, dass die Annahme, dass Sie diesen Code verwenden, nicht gerechtfertigt ist - aber mein Punkt ist, dass die richtige Antwort von den beteiligten Typen abhängt und die Frage nicht angibt, was diese Typen sind / p>
Wenn Sie nun tatsächlich mit einem Typ arbeiten, bei dem der Zugriff auf KeyValues
und Count
billig ist (was sehr wahrscheinlich ist), würde ich nicht erwarten, dass es einen großen Unterschied gibt. Wohlgemerkt, ich würde fast immer foreach
verwenden, wo möglich:
Auf diese Weise brauchen Sie nie die Zählung. Aber dann hast du auch nicht gesagt, was du in der Schleife machen willst. (Tipp: Um mehr nützliche Antworten zu erhalten, weitere Informationen bereitstellen .)
hängt davon ab, wie schwierig es ist, dwhSessionDto.KeyValues.Count
zu berechnen, wenn es nur ein Zeiger auf ein int
ist, dann ist die Geschwindigkeit jeder Version gleich. Wenn jedoch der Count
-Wert berechnet werden muss, wird er jedes Mal berechnet und beeinträchtigt daher die Leistung.
BEARBEITEN - gibt einen Code an, um zu demonstrieren, dass die Bedingung immer erneut ausgewertet wird.
%Vor%Der Ausgang ist 0, 1, 2 - nur!
Siehe Kommentare für Gründe, warum diese Antwort falsch ist.
Wenn ein Unterschied besteht, ist es umgekehrt: In der Tat könnte der erste schneller sein. Das liegt daran, dass der Compiler erkennt, dass Sie von 0 bis zum Ende des Arrays iterieren. Daher kann es Begrenzungen innerhalb der Schleife ignorieren (d. H. Wenn Sie auf dwhSessionDTo.KeyValues[i]
zugreifen).
Allerdings glaube ich, dass der Compiler diese Optimierung nur auf Arrays anwendet, so dass hier wahrscheinlich kein Unterschied besteht.
Es ist unmöglich zu sagen, ohne die Implementierung von dwhSessionDto.KeyValues.Count
und den Schleifenkörper zu kennen.
Nehmen Sie eine globale Variable bool foo = false;
an und folgen Sie den folgenden Implementierungen:
Nun wird die erste Schleife ungefähr doppelt so schnell wie die zweite durchführen; D
Unter der Annahme einer nicht-schwachsinnigen Implementierung ist die zweite jedoch wahrscheinlicher schneller.
Es gibt keinen Unterschied, aber warum denken Sie, dass es Unterschiede gibt, können Sie bitte Ihre Ergebnisse veröffentlichen?
wenn Sie die Implementierung des Einfügeelements im Wörterbuch mit reflector sehen
%Vor%}
Count ist ein internes Mitglied dieser Klasse, die jedes Element, das Sie in ein Wörterbuch einfügen, inkrementiert.
ich glaube also, dass es überhaupt keinen Unterschied gibt.
Die zweite Version kann manchmal schneller sein. Der Punkt ist, dass die Bedingung nach jeder Iteration neu bewertet wird, wenn also z. der Getter von "Count" zählt tatsächlich die Elemente in einem IEnumerable oder interagiert eine Datenbank / etc, dies verlangsamt die Dinge.
Ich würde also sagen, dass die zweite Version sicherer ist, wenn Sie den Wert von "Count" im "for" nicht beeinflussen.
Tags und Links c#