Ich schreibe einen Mesh-Rendering-Manager und dachte, es wäre eine gute Idee, alle Meshes, die denselben Shader verwenden, zu gruppieren und diese dann zu rendern, während ich mich in diesem Shader-Pass befinde.
Ich verwende derzeit eine foreach
Schleife, habe mich aber gefragt, ob die Verwendung von LINQ zu einer Leistungssteigerung führen könnte.
c#
performance
linq
foreach
Neil Knight
quelle
quelle
Antworten:
Warum sollte LINQ schneller sein? Es werden auch intern Schleifen verwendet.
In den meisten Fällen ist LINQ etwas langsamer, da dadurch Overhead entsteht. Verwenden Sie LINQ nicht, wenn Sie viel Wert auf Leistung legen. Verwenden Sie LINQ, weil Sie kürzeren, besser lesbaren und wartbaren Code wünschen.
quelle
LINQ-to-Objects wird im Allgemeinen einige marginale Gemeinkosten hinzufügen (mehrere Iteratoren usw.). Es muss immer noch die Schleifen ausführen und hat Delegatenaufrufe und muss im Allgemeinen eine zusätzliche Dereferenzierung durchführen, um an erfasste Variablen usw. zu gelangen. In den meisten Codes ist dies praktisch nicht nachweisbar und wird durch den einfacher zu verstehenden Code mehr als ermöglicht .
Bei anderen LINQ-Anbietern wie LINQ-to-SQL sollte die Abfrage, da sie auf dem Server gefiltert werden kann, viel besser sein als eine Wohnung
foreach
, aber höchstwahrscheinlich hätten Sie"select * from foo"
sowieso keine Decke erstellt , sodass dies nicht unbedingt fair ist Vergleich.Re PLINQ; Parallelität kann die verstrichene Zeit verkürzen , aber die Gesamt-CPU-Zeit erhöht sich normalerweise geringfügig aufgrund des Overheads der Thread-Verwaltung usw.
quelle
List<Foo>
; Stattdessen sollte ich einenforeach
Block für diese Sammlungen verwenden. Die Empfehlung,foreach
in diesen Kontexten zu verwenden, ist sinnvoll. Mein Anliegen:foreach
Sollte ich LINQ-Abfragen nur ersetzen, wenn ich ein Leistungsproblem feststelle? In Zukunft werde ich dasforeach
erste betrachten.Ich denke, LINQ ist besser über eine
foreach
Schleife zu verwenden, da es Ihnen viel saubereren und leicht verständlichen Code bietet. Aber LINQ ist langsamer alsforeach
. Weitere Informationen finden Sie im Artikel LINQ vs FOREACH vs FOR Loop Performance .quelle
LINQ ist jetzt langsamer, aber es könnte irgendwann schneller werden. Das Gute an LINQ ist, dass Sie sich nicht darum kümmern müssen, wie es funktioniert. Wenn eine neue Methode entwickelt wird, die unglaublich schnell ist, können die Mitarbeiter von Microsoft sie implementieren, ohne es Ihnen zu sagen, und Ihr Code wäre viel schneller.
Noch wichtiger ist jedoch, dass LINQ viel einfacher zu lesen ist. Das sollte Grund genug sein.
quelle
Es sollte wahrscheinlich beachtet werden, dass die
for
Schleife schneller ist als dieforeach
. Verwenden Sie für den ursprünglichen Beitrag einefor
Schleife , wenn Sie sich Sorgen über die Leistung einer kritischen Komponente wie eines Renderers machen .Referenz: Welche Schleife wird in .NET schneller ausgeführt, 'for' oder 'foreach'?
quelle
Wenn Sie paralleles LINQ für mehrere Kerne verwenden, erhalten Sie möglicherweise eine Leistungssteigerung. Siehe Parallel LINQ (PLINQ) (MSDN).
quelle
Ich war an dieser Frage interessiert, also habe ich gerade einen Test gemacht. Verwenden von .NET Framework 4.5.2 auf einer Intel (R) Core (TM) i3-2328M-CPU mit 2,20 GHz, 2200 MHz, 2 Core (s) und 8 GB RAM unter Microsoft Windows 7 Ultimate.
Es sieht so aus, als wäre LINQ möglicherweise schneller als für jede Schleife. Hier sind die Ergebnisse, die ich erhalten habe:
Es wäre interessant, wenn einige von Ihnen diesen Code kopieren und in eine Konsolen-App einfügen und auch testen könnten. Vor dem Testen mit einem Objekt (Mitarbeiter) habe ich denselben Test mit ganzen Zahlen versucht. Auch dort war LINQ schneller.
quelle
Exists=True Time=184 Exists=True Time=135
es auf einem Apache Gaming-Laptop (Win 10, C # 7.3). Kompiliert und im Debug-Modus ausgeführt. Wenn ich die Tests rückgängig mache, bekomme ichExists=True Time=158 Exists=True Time=194
. Scheint, als wäre Linq optimierter, denke ich.Dies ist eigentlich eine ziemlich komplexe Frage. Mit Linq ist es sehr einfach, bestimmte Dinge zu tun. Wenn Sie sie selbst implementieren, können Sie darüber stolpern (z. B. linq .Except ()). Dies gilt insbesondere für PLinq und insbesondere für die von PLinq implementierte parallele Aggregation.
Im Allgemeinen ist linq bei identischem Code aufgrund des Overheads des Delegatenaufrufs langsamer.
Wenn Sie jedoch eine große Anzahl von Daten verarbeiten und relativ einfache Berechnungen auf die Elemente anwenden, erhalten Sie eine enorme Leistungssteigerung, wenn:
Sie verwenden eine for-Schleife, um auf jedes Element zuzugreifen (im Gegensatz zu foreach oder linq).
quelle