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?
Antwort
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.
Aha! Ich wusste, du hattest drei Hände. –
So sehe ich, dass Linq-to-Objects in 'nicht ungewöhnlichen' Szenarien ineffizient ist. – NLV
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
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.
"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
wie ich sagte "es sei denn ..." –
Mein Punkt ist, dass die Backing-Datenstruktur * unterstützt * es, aber LINQ to Objects möglicherweise nicht diese Unterstützung verwenden. – Ani
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.
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. –
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.
- 1. Warum verbessert dies die Leistung?
- 2. Firebase - verbessert Caching die Leistung?
- 3. Verbessert Caching immer die Leistung?
- 4. Wie verbessert man die Webpack-Leistung?
- 5. Wie kann die SQLLDR-Leistung verbessert werden?
- 6. Wann verbessert Parallelität/Multithreading die Leistung?
- 7. Node.js Cluster nicht verbessert die Leistung erheblich
- 8. Wie verbessert man SQLAlchemy Leistung?
- 9. Wie verbessert man die Leistung von SimpleDateFormat in ThreadLocal eingewickelt?
- 10. Wie verbessert man die Leistung von Code mit Sink?
- 11. Wie verbessert man die Leistung von Haskell IO?
- 12. Wie verbessert man die anfängliche Rendering-Leistung von mobilen Geräten?
- 13. Zugriff auf Range.Start in Loop verbessert die Leistung von Comparer
- 14. Verbessern LINQ Leistung
- 15. Verbessert die Weitergabe von Werten durch Referenz die Geschwindigkeit signifikant?
- 16. linq foreach Leistung
- 17. Verbessert die Einschränkung einer Abfrage auf einen Datensatz die Leistung
- 18. Warum die indizierte Sicht die Leistung nicht verbessert?
- 19. Wie verbessert man die Leistung dieser numerischen Berechnung in Haskell?
- 20. Wie verbessert man die Leistung in der Chiffreabfrage mit `ODER`?
- 21. LINQ Leistung
- 22. Wie kann die Garbage Collection-Leistung verbessert werden?
- 23. Warum "Use Strict" verbessert die Leistung 10x in diesem Beispiel?
- 24. Wie kann die Leistung dieses Steuerelements verbessert werden?
- 25. Wie verbessert man die Leistung dieses Python-Codes?
- 26. Was ist mit CMOV, das die CPU-Pipeline-Leistung verbessert?
- 27. Wie verbessert man die Leistung für große Datensätze mit Realm?
- 28. Verbessert das Entfernen überqualifizierter Elemente wirklich die Leistung?
- 29. Wie kann die Tx-Leistung im USB-Gerätetreiber verbessert werden?
- 30. Verbessert die Denormalisierung von Zeilen in Spalten die Leistung in SQL Server?
LINQ ist keine Magie. –
Ich sah jemanden ziehen ein IEnumerable aus einem Hut einmal ..... –