Angenommen, es gibt ein bisschen Code, der Dateien für mehrere Konsumenten liest, und die Dateien haben eine beliebige Größe: Ab welcher Größe wird es effizienter, die Datei asynchron zu lesen? Oder anders ausgedrückt: Wie klein muss eine Datei sein, damit sie schneller ist, nur um sie synchron zu lesen?
Mir ist aufgefallen (und ich bin vielleicht falsch), dass das asynchrone Lesen sehr kleiner Dateien länger dauert als das synchrone (insbesondere bei .NET). Ich gehe davon aus, dass dies mit der Einrichtungszeit für Dinge wie E / A-Abschlussports, Threads usw. zu tun hat.
Gibt es eine Faustregel, um hier zu helfen? Oder ist es abhängig vom System und der Umgebung?
efficiency
async
io
Fleisch
quelle
quelle
Antworten:
Leider lautet die Antwort: "Es kommt darauf an." Es wäre einfach für Sie, ein kleines Programm zu schreiben, um die Zeiten von asynchronen und synchronen Lesevorgängen empirisch zu bestimmen.
Es wird von vielen Faktoren abhängen. Werden sie auf rotierenden Festplatten, SSD oder einem Netzwerklaufwerk gespeichert? Welche Art von CPU verwenden Sie? Wie viele Sockel / Kerne? Laufen Sie in einer VM oder Bare-Metal? Führen Sie ein altes oder ein modernes Betriebssystem aus?
quelle
Async hat 3 Hauptvorteile:
Ich glaube, der Hauptvorteil des asynchronen Lesens liegt darin, dass Sie mit vielen Dateien arbeiten oder viel CPU-Leistung benötigen.
quelle
blocked waiting for I/O
(0% CPU) aufcontinue normal processing
(> 0% CPU).Es hängt davon ab, ob
Zu beachten ist, wie teuer ein Kontextwechsel zwischen Prozessen ist. Node.JS ist so konzipiert, wie es ist, weil es davon ausgeht, dass das Ausführen eines Kontextwechsels sehr teuer ist und ansonsten viele Prozesse auf den IE warten, die den Computer zum Stillstand bringen.
Andererseits macht Erlang einen Prozesskontextwechsel sehr billig, sodass alles synchron sein kann und die Erlang-Laufzeit den Überblick über das Ganze behalten kann.
Also die zu berücksichtigenden Faktoren:
Und ich bin sicher, ich lasse ein halbes Dutzend Faktoren aus
quelle
Ich bin mir nicht sicher, ob es einen bestimmten "Punkt" gibt, aber es ist am sinnvollsten, wenn viele Threads arbeiten, da Sie so Ihre E / A mit anderen Arbeiten überlappen können. Wenn Sie freie Threads im Leerlauf haben, bietet das asynchrone Lesen keinen Vorteil. Nur wenn sich die Arbeitswarteschlangen füllen und Ihr Thread möglicherweise andere Aufgaben ausführt, anstatt auf E / A zu warten, bietet der asynchrone Dateizugriff Vorteile.
quelle
Ich denke, das Problem ist hier nicht so sehr die Lesegeschwindigkeit, sondern die Latenz.
Wenn Sie von einem Netzwerklaufwerk oder von einem langsamen mechanischen Festplattenlaufwerk mit langen Warteschlangen lesen, wird die Leistung beim Lesen stark beeinträchtigt. Und wenn Ihre App auch das Lesen im GUI-Thread durchführt, in diesem Fall handelt es sich um eine sehr schlechte Anwendung, dann ist sie für den Benutzer schrecklich.
quelle