Zakładając, że jest trochę kodu, który odczytuje pliki dla wielu konsumentów, a pliki mają dowolny dowolny rozmiar: przy jakim rozmiarze bardziej efektywne jest odczytywanie pliku asynchronicznie? Innymi słowy, jak mały musi być plik, aby był szybszy tylko po to, by czytać go synchronicznie?
Zauważyłem (i być może się mylę), że podczas czytania bardzo małych plików odczytanie ich asynchronicznie zajmuje więcej czasu niż synchronicznie (w szczególności w .NET). Zakładam, że ma to związek z czasem konfiguracji takich rzeczy, jak porty zakończenia we / wy, wątki itp.
Czy jest tu jakaś praktyczna zasada? A może zależy to od systemu i środowiska?
efficiency
async
io
blesh
źródło
źródło
Odpowiedzi:
Niestety odpowiedź brzmi: „to zależy”. Łatwo byłoby napisać mały program, który empirycznie określi czasy odczytów asynchronicznych i synchronizacyjnych.
Będzie to zależeć od wielu czynników. Czy są przechowywane na wirujących dyskach, dysku SSD lub dysku sieciowym? Jakiego procesora używasz? Ile gniazd / rdzeni? Czy pracujesz na maszynie wirtualnej czy na gołym metalu? Czy korzystasz ze starożytnego systemu operacyjnego, czy nowoczesnego?
źródło
Async ma 3 główne zalety:
Uważam, że główną zaletą odczytu asynchronicznego jest praca z dużą ilością plików lub potrzeba dużej mocy procesora.
źródło
blocked waiting for I/O
(0% procesora) nacontinue normal processing
(> 0% procesora).To zależy
Należy pamiętać o tym, jak kosztowne jest przełączanie kontekstu między procesami. Node.JS został zaprojektowany tak, jak jest, ponieważ zakłada, że wykonanie przełącznika kontekstu jest bardzo drogie i w przeciwnym razie będziesz mieć wiele procesów oczekujących na IE, które spowodują błąd komputera.
Z drugiej strony Erlang sprawia, że przełącznik kontekstu procesu jest bardzo tani, więc wszystko może być synchroniczne, a czas działania Erlang może śledzić całość.
Czynniki do rozważenia:
I jestem pewien, że pomijam pół tuzina czynników
źródło
Nie jestem pewien, czy jest jakiś konkretny „punkt”, ale ma to sens, gdy masz wiele wątków, ponieważ pozwala na nakładanie I / O na inne prace. Jeśli masz zapasowe wątki bezczynne, czytanie asynchroniczne nie przyniesie ci żadnej korzyści. Tylko wtedy, gdy zapełniają się kolejki robocze i wątek może przydać się do wykonywania innych zadań zamiast czekać na operacje we / wy, dostęp do pliku asynchronicznego daje jakąkolwiek korzyść.
źródło
Myślę, że problemem nie są tak duże prędkości odczytu, ale opóźnienie.
Jeśli czytasz z dysku sieciowego lub z powolnego mechanicznego dysku twardego z długimi kolejkami, wydajność wymaga szybkiego odczytu. A jeśli twoja aplikacja również czyta w wątku GUI, w takim przypadku jest to bardzo zła aplikacja, to będzie okropne dla użytkownika.
źródło