Asynchrone Operationen Leistung
-
05-09-2019 - |
Frage
Eines der Merkmale von asynchroner Programmierung in .NET Threads während der langen laufenden Betrieb Ausführung zu speichern. Die FileStream
Klasse eingerichtet werden kann asynchrone Operationen zu ermöglichen, dass ermöglicht (z), um eine Kopieroperation ausgeführt wird, ohne praktisch alle Threads. Zu meiner Überraschung fand ich, dass laufende Kopie asynchrone Stromes führt nicht nur langsamer, sondern nutzt auch mehr Rechenleistung als Synchron stream copy-äquivalent.
Gibt es ein Benchmark-Tests wurden ein synchrone vs asynchroner Betrieb Ausführung vergleichen getan (Datei, Netzwerk, etc.)? Ist es sinnvoll wirklich einen asynchronen Vorgang statt Spanning separaten Thread ausführen und einen synchronen Betrieb in Server-Umgebung durchzuführen, wenn die asynchrone Operation ist mal langsamer als die Synchron ein?
Lösung
Eigentlich sind die Bedingungen, unter denen Datei i / o wird wirklich asynchron sind sehr spezifisch, auch in der nativen Win32-Ebene. Siehe diesen Artikel für weitere Details.
Andere Tipps
aus dem Artikel Zitieren Sie in Ihrem Kommentar aufgenommen @ Alex Antwort.
In Situationen, in denen eine E / A-Anforderung erwartet, dass eine große Menge an zu übernehmen Zeit, wie zum Beispiel einer Auffrischung oder Sicherung eines große Datenbank oder eine langsame Kommunikationsverbindung, asynchrone I / O ein guter Weg ist in der Regel zu optimieren Verarbeitungseffizienz. Doch für relativ schnelle I / O-Operationen, die Overhead der Verarbeitung Kernel I / O Anfragen und Kernel-Signale können machen asynchrone I / O weniger vorteilhaft, insbesondere dann, wenn viele schnellen I / O Operationen vorgenommen werden müssen. In diesem Fall synchrone E / A wäre besser. Die Mechanismen und Umsetzung Einzelheiten darüber, wie diese zu erreichen, Aufgaben variieren in Abhängigkeit von der Art der Vorrichtung Griff, der verwendet wird, und die besondere Bedürfnisse der Anwendung. Mit anderen Worten gibt es in der Regel mehrere Möglichkeiten, das Problem zu lösen.
FWIW, ich denke, @ Alex richtig ist, dass es ein anderer Thread ist, den Kernel-Code im Zusammenhang mit Ihrer E / A-Anforderung ausgeführt wird. Das Gewinde wird durch Ihre Anwendung nicht verwaltet, though. Der Thread des Kernel-Code ausgeführt werden kann dich auf einem Gerät I / O-Anforderung blockieren und für die eigentliche Hardware warten, um die Anforderung abzuschließen, bevor Sie Ihren Benutzermodus-Thread signalisiert, aber es ist immer noch da dennoch.
asynchrone Threads verwenden soll nicht als Möglichkeit gedacht werden, um die Geschwindigkeit einer bestimmten Anforderung zu erhöhen, sondern eine Möglichkeit, die Gesamteffizienz zu erhöhen, indem Ihre Anwendung ermöglicht die Verarbeitung auf anderen Aufgaben fortzusetzen, während relativ langsam mich erwartet / O .
Sind Sie sicher, dass Sie Ihren Kopiervorgang richtig gebenchmarkt? All asynchroner Betrieb nur neuen Thread erstellen und führt den Betrieb in neuem Thread während Hauptthread für andere Dinge zu tun.
Die asynchronen Operationen geben meist ein einige Vereinfachungen (weniger Code-Zeilen) über den Faden selbst zu schaffen, aber sie sollten nicht mehr die Leistung auswirken dann einen neuen Thread zu erstellen.