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 IEnumerable
LINQ-to-Objects-Anbieter. Nehmen wir weiter an, dass jede Func
als 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 GetHashCode
der 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
?
OrderBy
wü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?
Contains
wä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?