Di recente ho iniziato a utilizzare LINQ un po 'e non ho davvero visto alcun accenno alla complessità del runtime per nessuno dei metodi LINQ. Ovviamente, ci sono molti fattori in gioco qui, quindi limitiamo la discussione al semplice IEnumerable
provider LINQ-to-Objects. Inoltre, supponiamo che qualsiasi operazione Func
passata come selettore / mutatore / ecc. Sia un'operazione O (1) economica.
Appare evidente che tutte le operazioni single-pass ( Select
, Where
, Count
, Take/Skip
, Any/All
, etc.) saranno O (n), in quanto solo bisogno di percorrere la sequenza una volta; anche se anche questo è soggetto a pigrizia.
Le cose sono più oscure per le operazioni più complesse; il set-come operatori ( Union
, Distinct
, Except
, etc.) lavoro utilizzando GetHashCode
di default (afaik), così sembra ragionevole supporre che stanno usando un hash-table internamente, rendendo queste operazioni O (n), nonché, in generale. E le versioni che usano un IEqualityComparer
?
OrderBy
avrebbe bisogno di un ordinamento, quindi molto probabilmente stiamo guardando O (n log n). E se fosse già ordinato? Che ne dici se dico OrderBy().ThenBy()
e fornisco la stessa chiave a entrambi?
Ho potuto vedere GroupBy
(e Join
) usare l'ordinamento o l'hashing. Cos'è questo?
Contains
sarebbe O (n) su a List
, ma O (1) su a HashSet
- LINQ controlla il contenitore sottostante per vedere se può accelerare le cose?
E la vera domanda: finora, ho creduto che le operazioni fossero performanti. Tuttavia, posso scommettere su questo? I contenitori STL, ad esempio, specificano chiaramente la complessità di ogni operazione. Esistono garanzie simili sulle prestazioni di LINQ nella specifica della libreria .NET?
Altre domande (in risposta ai commenti):
non avevo davvero pensato al sovraccarico, ma non mi aspettavo che ci fosse molto per il semplice Linq-to-Objects. Il post di CodingHorror parla di Linq-to-SQL, dove posso capire che l'analisi della query e rendere SQL aggiungerebbe dei costi - c'è un costo simile anche per il provider di oggetti? Se è così, è diverso se stai usando la sintassi dichiarativa o funzionale?