2010-02-27 8 views
7

Welche LINQ to Objects-Optimierungstechniken verwenden Sie oder haben Sie in freier Wildbahn gesehen?LINQ zu Objects Optimization Techniques?

Während für „yield foreach“ und andere Sprache/Compiler-Optimierungen warten in 201x in C# kommen, ich bin interessant möglich alles zu tun, überall weniger eine Leistung Schmerz mit LINQ zu machen.

Ein Muster, das ich bisher gesehen habe, erstellt benutzerdefinierte IEnumerable-Implementierungen für bestimmte Kombinatoren, sodass das Enumerable nicht mehrmals neu nummeriert wird.

+0

"Erstellen benutzerdefinierter IEnumerable-Implementierungen für bestimmte Kombinatoren, so dass das Enumerable nicht mehrfach aufgezählt wird" -> taktischer Einsatz von 'ToArray', sicher? –

+0

ToArray ist nicht immer die Antwort. Zum Beispiel in einem rekursiven Szenario. –

Antwort

10

Eines, das ich habe ein paar Mal gesichtet - nicht verwenden:

if (query.Count() > 0) 

... verwenden Sie stattdessen:

if (query.Any()) 

Auf diese Weise muss er nur das erste Spiel finden .

EDIT: Sie können auch in einem blog post I recently wrote über Optimierungen interessiert sein, die in LINQ to Objects sein könnte, aber nicht (oder waren nicht in .NET 3.5).

Außerdem, wenn Sie eine Menge x.Contains(y) Operationen und x tun werden ist das Ergebnis einer vorhandenen Abfrage (dh es nicht bereits eine optimierte Sammlung zu gehen), dann sollten Sie erwägen, einen HashSet<T> von x Gebäude zu Vermeiden Sie einen linearen Scan (Ausführen der Abfrage, um die Ergebnisse von x zu produzieren) bei jeder Iteration.

+0

Das ist ein ausgezeichneter Tipp! –

+0

Natürlich ist Any viel besser als Count. Ich habe gerade BCL 4 demontiert und ElementAt ist jetzt für ILists optimiert; In diesem Fall wird eine einfache Liste [Index] nachgeschlagen. –

+0

Ich habe gerade die BCL 4 Reverse() überprüft und es ist auch langsam. Es ist sehr trivial, einen Direktzugriffsumkehr-Enumerable wie erwähnt zu implementieren. Ich habe es gerade getan und es ist deutlich schneller. Also werde ich das in meine Trickkiste aufnehmen. –