Linq hat als integrierte Technologie Leistungsvor- und -nachteile. Dem Code hinter den Erweiterungsmethoden wurde vom .NET-Team erhebliche Aufmerksamkeit geschenkt, und seine Fähigkeit, eine verzögerte Auswertung bereitzustellen, bedeutet, dass die Kosten für die Durchführung der meisten Manipulationen an einer Gruppe von Objekten auf den größeren Algorithmus verteilt sind, der die manipulierte Gruppe erfordert . Es gibt jedoch einige Dinge, die Sie wissen müssen, um die Leistung Ihres Codes zu beeinträchtigen oder zu beeinträchtigen.
In erster Linie spart Linq Ihrem Programm nicht auf magische Weise die Zeit oder den Speicher, die für die Ausführung einer Operation erforderlich sind. Dies kann diese Vorgänge nur verzögern, bis sie unbedingt benötigt werden. OrderBy () führt einen QuickSort durch, der genauso lange dauert, als hätten Sie Ihren eigenen QuickSorter geschrieben oder List.Sort () zum richtigen Zeitpunkt verwendet. Denken Sie also immer daran, was Sie von Linq verlangen, wenn Sie Abfragen schreiben. Wenn eine Manipulation nicht erforderlich ist, versuchen Sie, die Abfrage- oder Methodenkette neu zu strukturieren, um dies zu vermeiden.
Aus dem gleichen Grund erfordern bestimmte Operationen (Sortieren, Gruppieren, Aggregieren) die Kenntnis der gesamten Menge, auf die sie einwirken. Das allerletzte Element in einer Reihe könnte das erste sein, das die Operation von ihrem Iterator zurückgeben muss. Da Linq-Operationen ihre aufzählbare Quelle nicht ändern sollten, aber viele der von ihnen verwendeten Algorithmen (dh In-Place-Sortierungen), werden diese Operationen nicht nur ausgewertet, sondern die gesamte Aufzählung in eine konkrete, endliche Struktur kopiert , die Operation ausführen und durch sie nachgeben. Wenn Sie also OrderBy () in einer Anweisung verwenden und nach einem Element aus dem Endergebnis fragen, wird ALLES, was die ihm gegebene IEnumerable erzeugen kann, ausgewertet, als Array im Speicher gespeichert, sortiert und dann ein Element an a zurückgegeben Zeit. Die Moral ist,
Schließlich erhöhen Linq-Methoden die Größe des Aufrufstapels und den Speicherbedarf Ihres Systems drastisch. Jede Operation, die den gesamten Satz kennen muss, behält den gesamten Quellensatz im Speicher, bis das letzte Element iteriert wurde, und die Auswertung jedes Elements umfasst einen Aufrufstapel, der mindestens doppelt so tief ist wie die Anzahl der Methoden in Ihrer Kette oder Ihren Klauseln in Ihrer Inline-Anweisung (ein Aufruf von MoveNext () jedes Iterators oder GetEnumerator plus mindestens ein Aufruf von jedem Lambda auf dem Weg). Dies führt einfach zu einem größeren, langsameren Algorithmus als ein intelligent entwickelter Inline-Algorithmus, der dieselben Manipulationen ausführt. Der Hauptvorteil von Linq ist die Einfachheit des Codes. Das Erstellen und Sortieren eines Wörterbuchs mit Listen von Gruppenwerten ist kein leicht verständlicher Code (vertrauen Sie mir). Mikrooptimierungen können dies weiter verschleiern. Wenn die Leistung Ihr Hauptanliegen ist, verwenden Sie Linq nicht. Dies erhöht den Zeitaufwand um ca. 10% und den Speicheraufwand für die Bearbeitung einer Liste selbst um ein Vielfaches. Die Wartbarkeit ist jedoch in der Regel das Hauptanliegen der Entwickler, und Linq hilft dort ENDGÜLTIG.
Zum Performance-Kick: Wenn die Leistung Ihres Algorithmus die heilige, kompromisslose erste Priorität ist, würden Sie in einer nicht verwalteten Sprache wie C ++ programmieren. .NET wird aufgrund seiner verwalteten Laufzeitumgebung mit nativer JIT-Kompilierung, verwaltetem Speicher und zusätzlichen Systemthreads viel langsamer. Ich würde eine Philosophie annehmen, dass es "gut genug" ist; Linq kann von Natur aus Verlangsamungen einführen, aber wenn Sie den Unterschied nicht erkennen können und Ihr Kunde den Unterschied nicht erkennen kann, gibt es für alle praktischen Zwecke keinen Unterschied. "Vorzeitige Optimierung ist die Wurzel allen Übels"; Lassen Sie es funktionieren, und suchen Sie dann nach Möglichkeiten, um es leistungsfähiger zu machen, bis Sie und Ihr Kunde sich einig sind, dass es gut genug ist. Es könnte immer "besser" sein, aber es sei denn, Sie möchten Maschinencode von Hand verpacken,