2010-02-27 2 views
7

Quali tecniche di ottimizzazione LINQ to Objects usi o hai visto in natura?LINQ to Objects Tecniche di ottimizzazione?

In attesa di "yield foreach" e altre ottimizzazioni del linguaggio/compilatore per arrivare in C# in 201x, sono interessante nel fare tutto il possibile per rendere l'uso di LINQ ovunque meno un problema di prestazioni.

Uno schema che ho visto finora è la creazione di implementazioni IEnumerable personalizzate per combinatori specifici in modo che l'enumerabile non venga ri-enumerato più volte.

+0

"creazione di implementazioni IEnumerable personalizzate per combinatori specifici in modo che l'enumerable non venga ri-enumerato più volte" -> uso tattico di "ToArray", sicuramente? –

+0

ToArray non è sempre la risposta. In uno scenario ricorsivo, per esempio. –

risposta

10

Uno che ho notato un paio di volte - non utilizzare:

if (query.Count() > 0) 

... utilizzare questo invece:

if (query.Any()) 

In questo modo ha solo bisogno di trovare la prima partita .

EDIT: Si può anche essere interessati a un blog post I recently wrote su ottimizzazioni che potrebbe essere in LINQ to Objects, ma non sono (o non erano in .NET 3.5).

Inoltre, se avete intenzione di fare un sacco di x.Contains(y) operazioni e x è il risultato di una query esistente (vale a dire che non è già andando essere qualche raccolta ottimizzata), probabilmente si dovrebbe prendere in considerazione la costruzione di un HashSet<T> da x a evitare una scansione lineare (eseguendo la query per produrre i risultati di x) su ogni iterazione.

+0

Questo è un consiglio eccellente! –

+0

Certamente Any è molto meglio di Count. Ho appena smontato BCL 4 e ElementAt ora è ottimizzato per ILists; fa una semplice lista [indice] ricerca in quel caso. –

+0

Ho appena controllato il BCL 4 Reverse() ed è anche lento. È molto semplice implementare un inverso di accesso casuale numerabile come si menziona. L'ho appena fatto ed è molto più veloce. Quindi includerò questo nella mia borsa dei trucchi. –