J'ai récemment commencé à utiliser un peu LINQ, et je n'ai vraiment vu aucune mention de la complexité d'exécution pour aucune des méthodes LINQ. De toute évidence, de nombreux facteurs sont en jeu ici, nous allons donc limiter la discussion au IEnumerable
fournisseur LINQ-to-Objects. De plus, supposons que tout élément Func
passé en tant que sélecteur / mutateur / etc. est une opération O (1) bon marché.
Il semble évident que toutes les opérations monopasse ( Select
, Where
, Count
, Take/Skip
, Any/All
, etc.) seront O (n), car ils ne doivent marcher une fois la séquence; bien que même cela soit sujet à la paresse.
Les choses sont plus troubles pour les opérations plus complexes; l'ensemble comme les opérateurs ( Union
, Distinct
, Except
, etc.) en utilisant le travail GetHashCode
par défaut (afaik), il semble donc raisonnable de supposer qu'ils utilisent une interne table de hachage, ce qui rend ces opérations O (n) et, en général. Qu'en est-il des versions qui utilisent un IEqualityComparer
?
OrderBy
aurait besoin d'un tri, donc nous examinons très probablement O (n log n). Et si c'est déjà trié? Et si je dis OrderBy().ThenBy()
et fournis la même clé aux deux?
Je pouvais voir GroupBy
(et Join
) utiliser soit le tri, soit le hachage. Lequel est-ce?
Contains
serait O (n) sur a List
, mais O (1) sur a HashSet
- LINQ vérifie-t-il le conteneur sous-jacent pour voir s'il peut accélérer les choses?
Et la vraie question - jusqu'à présent, je suppose que les opérations sont performantes. Cependant, puis-je miser là-dessus? Les conteneurs STL, par exemple, spécifient clairement la complexité de chaque opération. Existe-t-il des garanties similaires sur les performances LINQ dans la spécification de la bibliothèque .NET?
Plus de question (en réponse aux commentaires):
Je n'avais pas vraiment pensé à la surcharge, mais je ne m'attendais pas à ce qu'il y en ait beaucoup pour de simples Linq-to-Objects. Le post CodingHorror parle de Linq-to-SQL, où je peux comprendre l'analyse de la requête et rendre SQL ajouterait des coûts - y a-t-il également un coût similaire pour le fournisseur Objects? Si oui, est-ce différent si vous utilisez la syntaxe déclarative ou fonctionnelle?