Ich habe vor kurzem angefangen, LINQ ziemlich oft zu verwenden, und ich habe keine Erwähnung der Laufzeitkomplexität für eine der LINQ-Methoden gesehen. Offensichtlich spielen hier viele Faktoren eine Rolle. Beschränken wir die Diskussion daher auf den einfachen IEnumerableLINQ-to-Objects-Anbieter. Nehmen wir weiter an, dass jede Funcals Selektor / Mutator / etc. übergebene Operation eine billige O (1) -Operation ist.
Es scheint offensichtlich , dass alle die Single-Pass - Operationen ( Select, Where, Count, Take/Skip, Any/All, etc.) O (n) sein, da sie nur einmal die Sequenz gehen muß; obwohl auch dies der Faulheit unterliegt.
Bei den komplexeren Operationen ist es düsterer. die Set-wie Operatoren ( Union, Distinct, Except, etc.) arbeitet mit GetHashCodeder Standardeinstellung (afaik), so scheint es vernünftig , sie verwenden eine Hash-Tabelle intern, so dass diese Operationen O (n) als auch im Allgemeinen zu übernehmen. Was ist mit den Versionen, die ein verwenden IEqualityComparer?
OrderBywürde eine Sortierung benötigen, also schauen wir uns höchstwahrscheinlich O (n log n) an. Was ist, wenn es bereits sortiert ist? Wie wäre es, wenn ich OrderBy().ThenBy()beiden den gleichen Schlüssel sage und gebe?
Ich konnte sehen GroupBy(und Join) entweder Sortieren oder Hashing verwenden. Welches ist es?
Containswäre O (n) auf a List, aber O (1) auf a HashSet- prüft LINQ den zugrunde liegenden Container, um festzustellen, ob er die Dinge beschleunigen kann?
Und die eigentliche Frage - bisher habe ich davon ausgegangen, dass die Operationen performant sind. Kann ich mich jedoch darauf verlassen? STL-Container geben beispielsweise die Komplexität jeder Operation klar an. Gibt es ähnliche Garantien für die LINQ-Leistung in der .NET-Bibliotheksspezifikation?
Weitere Frage (als Antwort auf Kommentare):
Hatte nicht wirklich über Overhead nachgedacht, aber ich hatte nicht erwartet, dass es für einfache Linq-to-Objects sehr viel geben würde. In der CodingHorror-Veröffentlichung geht es um Linq-to-SQL, bei dem ich verstehen kann, dass das Parsen der Abfrage und das Erstellen von SQL zusätzliche Kosten verursachen. Gibt es ähnliche Kosten auch für den Objects-Anbieter? Wenn ja, ist es anders, wenn Sie die deklarative oder funktionale Syntax verwenden?