J'ai récemment commencé à l'aide de LINQ un peu, et je n'ai pas vraiment vu aucune mention de la durée d'exécution de la complexité pour l'une des méthodes LINQ. Évidemment, il y a beaucoup de facteurs en jeu, ici, nous allons donc restreindre la discussion à la plaine - IEnumerable
LINQ-to-Objets fournisseur. En outre, supposons que tout Func
transmis sous la forme d'un sélecteur / mutateur / etc. est un bon O(1).
Il semble évident que tout le seul passe-opérations (Select
, Where
, Count
, Take/Skip
, Any/All
, etc.) O(n), puisqu'ils ont seulement besoin de marcher sur la séquence une fois; bien que même cela est soumis à la paresse.
Les choses sont claires pour les opérations plus complexes; l'ensemble-comme les opérateurs (Union
, Distinct
, Except
, etc.) travail à l'aide d' GetHashCode
par défaut (autant que je sache), il semble donc raisonnable de supposer qu'ils sont à l'aide d'une table de hachage en interne, ce qui rend ces opérations en O(n) ainsi, en général. Que sur les versions qui utilisent un IEqualityComparer
?
OrderBy
auraient besoin d'une sorte, donc, très probablement, nous sommes à la recherche en O(n log n). Que faire si il est déjà trié? Que diriez-vous si je dis OrderBy().ThenBy()
et de fournir la même clé pour tous les deux?
J'ai pu voir GroupBy
(et Join
) à l'aide de tri, ou le hachage. Qui est-il?
Contains
serait O(n) sur un List
, mais O(1) en HashSet
- ne LINQ vérifier le conteneur sous-jacent à voir si ça peut accélérer les choses?
Et la vraie question - jusqu'à présent, j'ai été prise sur la foi que les opérations sont performants. Cependant, puis-je banque sur qui? Des conteneurs STL, par exemple, d'indiquer clairement la complexité de chaque opération. Existe-il des garanties semblables sur LINQ performance dans le .NET-library cahier des charges?
Plus question (en réponse aux commentaires):
N'avais pas vraiment réfléchi dessus, mais je ne m'attendais pas là pour être très simple Linq-to-Objets. Le CodingHorror post parle de Linq-to-SQL, où je peux comprendre l'analyse de la requête et de prise de SQL s'ajouter le coût est - il un coût similaire pour les Objets fournisseur de trop? Si oui, est-elle différente si vous utilisez le déclaratif ou de syntaxe fonctionnelle?