2010-11-24 7 views
5

Ich habe Linq gegen einige Sammlungsobjekte (Dictionary, List) verwendet. Wenn ich also Elemente anhand eines Kriteriums auswählen möchte, schreibe ich eine Linq-Abfrage und liste dann das linq-Objekt auf. Meine Frage ist also, dass Linq das Schleifen der Hauptsammlung eliminiert und dadurch die Performance verbessert?Verbessert LINQ die Leistung durch Eliminieren von Schleifen?

+8

LINQ ist keine Magie. –

+6

Ich sah jemanden ziehen ein IEnumerable aus einem Hut einmal ..... –

Antwort

8

Absolut nicht. LINQ to Objects Loops intern - wie könnte es sonst noch funktionieren?

Auf der anderen Seite, LINQ effizienter als einige Ansätze ist nehmen Sie könnten, indem sie die Daten-Streaming nur, wenn es usw.

Auf der dritten Seite erforderlich ist, geht es um zusätzliche Schichten Indirektionsebene (alle Iteratoren usw.), die einen marginalen Effekt auf die Performance haben.

+10

Aha! Ich wusste, du hattest drei Hände. –

+0

So sehe ich, dass Linq-to-Objects in 'nicht ungewöhnlichen' Szenarien ineffizient ist. – NLV

+0

Oh gawd ... nicht schon wieder. @NLV, wie quantifizierst du ineffizient? Angesichts der Tatsache, dass Coder-Zeit viel mehr kostet als Hardware (selbst gemietete Hardware) und die Zeitersparnis, die Linq bietet ... gepaart mit der Tatsache, dass normalerweise etwa 90% des Codes nicht leistungskritisch sind, würde ich sagen, dass er nicht verwendet linq ist ineffizient. – spender

2

Wahrscheinlich nicht. LINQ eignet sich für kurz (hoffentlich) lesbaren Code.

Im Hintergrund läuft die Schleife, es sei denn, die Backing-Datenstruktur unterstützt einen effizienteren Suchalgorithmus als das Scannen.

+0

"es sei denn, die Backing-Datenstruktur unterstützt einen effizienteren Suchalgorithmus als das Scannen" - Dies ist im Allgemeinen nicht wahr, es sei denn, diese Optimierung wurde * speziell * in diesen Abfrageoperator eingebaut. Zum Beispiel ist "Überspringen" soweit ich weiß nicht für Listen optimiert. Und es gibt derzeit keine Möglichkeit für eine Sammlung, eine LINQ to Objects-Abfrage einzubinden. – Ani

+2

wie ich sagte "es sei denn ..." –

+0

Mein Punkt ist, dass die Backing-Datenstruktur * unterstützt * es, aber LINQ to Objects möglicherweise nicht diese Unterstützung verwenden. – Ani

2

Nein, in der Tat, wenn Sie LINQ to SQL verwenden, wird die Leistung ein wenig schlechter, weil LINQ schließlich eine zusätzliche Schicht auf dem ado.net-Stack ist.

wenn Sie linq über Objekte verwenden. Es gibt Optimierungen, die von linq durchgeführt werden, der wichtigste ist "Yield", der beginnt, Ergebnisse von einem IEnumerable zu liefern, wenn er generiert wird. Das ist besser als der Standardansatz, der darauf warten muss, dass eine Liste von der Funktion gefüllt und zurückgegeben wird, um darüber zu iterieren.

+0

LINQ to SQL: True, solange beide Abfragen identisch sind. Wenn Sie alles zurückziehen und dann LINQ für Objekte verwenden, um die Filterung durchzuführen, könnte es langsamer sein. LINQ to objects: Wenn Sie bereits eine vorgefüllte Liste haben, wird es nicht schneller. Alles hängt davon ab, was hinter den Kulissen passiert. –

1

Wenn Sie die Abfrage direkt verwenden, durchlaufen Sie immer noch die gesamte Sammlung. Sie sehen nicht alles, weil die Abfrage nur Elemente zurückgibt, die Ihrem Filter entsprechen. Die Gesamtleistung wird wahrscheinlich sogar einen Schlag bekommen, einfach wegen all der verschachtelten Iteratoren, die involviert sind. Wenn Sie in Ihrem Abfrageergebnis ToList() aufgerufen haben und dieses Ergebnis dann mehrmals verwendet haben, ist die Leistung besser.

Verwandte Themen