Dengan asumsi ada sedikit kode yang membaca file untuk banyak konsumen, dan file-file itu dari ukuran sembarang: Pada ukuran apa itu menjadi lebih efisien untuk membaca file secara tidak sinkron? Atau dengan kata lain, seberapa kecil suatu file agar lebih cepat hanya dengan membacanya secara sinkron?
Saya perhatikan (dan mungkin saya salah) bahwa ketika membaca file yang sangat kecil, perlu waktu lebih lama untuk membacanya secara tidak sinkron daripada sinkron (khususnya dengan .NET). Saya berasumsi ini ada hubungannya dengan mengatur waktu untuk hal-hal seperti I / O Completion Ports, threads, dll.
Apakah ada aturan praktis untuk membantu di sini? Atau tergantung pada sistem dan lingkungan?
efficiency
async
io
daging
sumber
sumber
Jawaban:
Sayangnya, jawabannya adalah, "itu tergantung." Akan mudah bagi Anda untuk menulis sebuah program kecil untuk secara empiris menentukan waktu dari kedua async dan sinkronisasi dibaca.
Itu akan tergantung pada banyak faktor. Apakah mereka disimpan di disk berputar, SSD, atau drive jaringan? CPU jenis apa yang Anda gunakan? Berapa soket / core? Apakah Anda menjalankan VM atau bare metal? Apakah Anda menjalankan OS kuno atau modern?
sumber
Async memiliki 3 keunggulan utama:
Saya percaya keuntungan utama dari asynchronous read adalah ketika Anda bekerja dengan banyak file atau Anda membutuhkan banyak daya CPU.
sumber
blocked waiting for I/O
(0% CPU) menjadicontinue normal processing
(> 0% CPU).Tergantung
Satu hal yang perlu diingat adalah seberapa mahal perubahan konteks antar proses. Node.JS dirancang seperti itu karena mengasumsikan bahwa melakukan pengalih konteks sangat mahal dan Anda akan memiliki banyak proses menunggu di IE yang akan merusak komputer.
Di sisi lain Erlang membuat proses konteks beralih sangat murah sehingga semuanya bisa sinkron dan waktu lari Erlang dapat melacak semuanya.
Jadi faktor yang perlu dipertimbangkan:
Dan saya yakin saya akan meninggalkan setengah lusin faktor
sumber
Saya tidak yakin ada "titik" tertentu, tetapi itu paling masuk akal ketika Anda memiliki banyak utas yang berfungsi, karena memungkinkan Anda untuk tumpang tindih I / O dengan pekerjaan lain. Jika Anda memiliki utas cadangan yang menganggur, membaca asinkron tidak akan memberi Anda keuntungan apa pun. Hanya ketika Anda memiliki antrian kerja yang terisi dan utas Anda bisa bermanfaat melakukan pekerjaan lain alih-alih menunggu I / O, akses file async memberi keuntungan.
sumber
Saya pikir masalahnya di sini bukan kecepatan membaca, karena latensi.
Jika Anda membaca dari drive jaringan, atau dari hard disk drive mekanis lambat dengan antrian panjang, kinerja akan mengambil menukik untuk membaca. Dan jika aplikasi Anda juga melakukan pembacaan di utas GUI, dalam hal ini aplikasi yang sangat buruk, maka itu akan mengerikan bagi pengguna.
sumber