C # FindAll VS Wo Geschwindigkeit
Jemand wissen, jede Geschwindigkeit Unterschiede zwischen dem, Wo und FindAll auf der Liste. Ich weiß, Wo ist Teil von IEnumerable und FindAll ist Teil der Liste, ich bin nur neugierig, was schneller ist.
Kommentar zu dem Problem
mögliche Duplikate von FindAll vs, Wo die extension-Methode
InformationsquelleAutor der Frage Dested | 2010-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die FindAll-Methode von List<T> - Klasse tatsächlich erstellt ein neues list-Objekt und fügt die Ergebnisse. Die Where-Erweiterungsmethode für IEnumerable<T> einfach Durchlaufen einer vorhandenen Liste und den Ertrag einer Aufzählung der matching-Ergebnisse, ohne das erstellen oder hinzufügen von etwas (anderes als der enumerator selbst.)
Gegeben, eine kleine Gruppe, die beiden würde wahrscheinlich ausführen vergleichbar. Jedoch, da eine größere Gruppe, Wo soll übertreffen FindAll, als die neue Liste erstellt und enthält die Ergebnisse dynamisch wachsen zu enthalten weitere Ergebnisse. Die Speicherauslastung von FindAll wird auch beginnen zu wachsen exponentiell mit der Anzahl der matching-Ergebnisse erhöht, wo, wie, Wo sollte konstant minimale Speicherauslastung (an und für sich...ohne, was auch immer Sie tun, mit den Ergebnissen.)
InformationsquelleAutor der Antwort jrista
FindAll ist offensichtlich langsamer als in Denen, denn es muss eine neue Liste erstellen.
Anyway, ich denke, Sie sollten wirklich Jon Hanna Kommentar - werden Sie wahrscheinlich benötigen, um einige Operationen auf Ihre Ergebnisse und die Liste wäre mehr als nützlich, IEnumerable in vielen Fällen.
Schrieb ich kleine testen, fügen Sie es in der Konsole App-Projekt. Es misst die Zeit/Zecken: Ausführung der Funktion, die Operationen auf die Ergebnisse Sammlung(perf. eine "echte" Nutzung, und sicher sein, dass der compiler nicht optimieren, ungenutzte Daten etc. - Ich bin neu in C# und weiß nicht, wie es funktioniert noch nicht,sorry).
Hinweis: jeder Funktion gemessen werden, außer WhereIENumerable() erzeugt eine neue Liste von Elementen. Könnte ich vielleicht etwas falsch, aber eindeutig zu iterieren IEnumerable braucht viel mehr Zeit als iterierende Liste.
Ergebnisse(Zecken) - Prüfsumme aktiviert(einige Operationen auf Ergebnisse), Modus: release ohne Debuggen(STRG+F5):
Prüfsumme deaktiviert (nicht mit der zurückgegebenen Liste):
Können die Ergebnisse etwas unterschiedlich, um echte Ergebnisse Sie brauchen mehr Iterationen.
InformationsquelleAutor der Antwort Wiory
Where
ist viel, viel schneller alsFindAll
. Egal wie groß die Liste ist,Where
nimmt genau die gleiche Menge an Zeit.Natürlich
Where
nur eine Abfrage erstellt. Es hat nicht wirklich etwas zu tun, im Gegensatz zuFindAll
die nicht eine Liste erstellen.InformationsquelleAutor der Antwort Jonathan Allen
.FindAll()
schneller sein soll, dauert es von Vorteil schon zu wissen, das Liste die Größe und die Schleife durch das interne array mit einem einfachenfor
Schleife..Where()
hat, um Feuer auf einen enumerator (versiegelt framework-Klasse genanntWhereIterator
in diesem Fall) und die gleiche Arbeit in einer weniger spezifischen Weise.Beachten Sie aber, dass .Wo() Durchlaufen, die nicht aktiv in der Schaffung einer Liste im Speicher und Befüllen. Es ist mehr wie ein Strom, so dass die Speichernutzung auf etwas sehr großes kann einen signifikanten Unterschied. Auch könnten Sie beginnen mit der Ergebnisse in einer parallel-Mode sehr viel schneller mit dort .Wo ( - ) Ansatz in 4.0.
InformationsquelleAutor der Antwort Nick Craver
Die Antwort von jrista macht Sinne. Jedoch, die neue Liste fügt die gleichen Objekte, also nur wachsen mit Verweis auf bestehende Objekte, die nicht sein sollten, langsam.
Solange 3.5 /Linq-extension möglich sind, Wo bleibt eh besser.
FindAll macht viel mehr Sinn, wenn nur mit 2.0
InformationsquelleAutor der Antwort Eric