Timer Node.js diimplementasikan dengan sangat efisien. Implementasinya (dijelaskan dalam artikel terperinci tentang cara kerjanya) dapat dengan mudah menangani penghitung waktu yang sangat banyak.
Mereka disimpan dalam daftar tertaut ganda yang diurutkan dan hanya timer berikutnya yang diaktifkan yang memiliki timer sistem libuv aktual yang terkait dengannya. Saat pengatur waktu itu menyala atau dibatalkan, pengatur waktu berikutnya dalam daftar menjadi pengatur waktu yang dilampirkan ke pengatur waktu sistem libuv yang sebenarnya. Ketika pengatur waktu baru disetel, itu hanya dimasukkan ke dalam daftar yang diurutkan dan, kecuali jika itu menjadi yang berikutnya untuk diaktifkan, itu hanya duduk di daftar menunggu giliran untuk menjadi yang berikutnya. Anda dapat memiliki ribuan ini dengan sangat efisien.
Berikut adalah beberapa sumber tentang cara kerja pengatur waktu ini:
Berapa banyak setTimeouts bersamaan sebelum masalah kinerja?
Bagaimana nodejs mengelola timer secara internal
Referensi pertama berisi sekumpulan komentar dari kode nodejs aktual yang menjelaskan cara kerja sistem daftar tertaut pengatur waktu dan untuk apa dioptimalkan.
Artikel kedua memberi Anda deskripsi tingkat yang sedikit lebih tinggi tentang bagaimana itu diatur.
Ada efisiensi lain sehingga ketika satu penghitung waktu sampai ke awal daftar dan diaktifkan, kemudian setelah memanggil panggilan balik itu, node.js memeriksa bagian depan daftar untuk penghitung waktu lain yang sekarang siap untuk diaktifkan juga. Ini akan menyapu timer lain dengan "waktu target" yang sama seperti yang pertama dan juga timer lain yang telah jatuh tempo saat berbagai panggilan balik lainnya berjalan.
Ketika Anda memiliki ribuan, akan memakan waktu sedikit lebih lama untuk memasukkan pengatur waktu baru ke dalam daftar tertaut yang diurutkan jika ada banyak pengatur waktu di sana, tetapi setelah dimasukkan, tidak masalah sama sekali berapa banyak yang ada karena hanya pernah melihat yang berikutnya untuk menembak. Jadi, proses duduk di sana dengan bahkan puluhan ribu penghitung waktu tertunda hanyalah satu pengatur waktu sistem (mewakili acara pengatur waktu berikutnya untuk diaktifkan) dan banyak data. Semua data untuk pengatur waktu mendatang lainnya tidak dikenakan biaya apa pun hanya dengan duduk di sana.
Untuk Javascript, mirip dengan solusi pertama python, saya dapat menelurkan setTimeouts sebanyak yang diperlukan, tetapi masalahnya adalah bahwa semua batas waktu berfungsi pada utas utama, tetapi seperti yang saya katakan, tugasnya tidak intensif sumber daya dan saya hanya perlu akurasi untuk kedua.
Tampaknya bagi saya bahwa nodejs dapat menangani jumlah setTimeout()
. Anda panggilan baik-baik saja. Jika Anda memiliki masalah di node.js, itu bukan karena jumlah penghitung waktu, tetapi Anda harus yakin bahwa Anda menerapkan CPU yang cukup untuk masalah tersebut jika Anda memiliki lebih banyak pekerjaan untuk diproses daripada yang dapat ditangani oleh satu inti. Anda dapat memperluas penggunaan inti dengan pengelompokan nodejs atau dengan antrian kerja yang menggunakan Utas Pekerja atau proses nodejs lainnya untuk membantu pemrosesan. node.js, dengan sendirinya, sangat efisien dengan apa pun yang terkait dengan I/O sehingga selama Anda tidak melakukan komputasi intensif CPU yang besar, satu utas node.js dapat menangani banyak pemrosesan peristiwa.
Ingatlah bahwa penghitung waktu Javascript tidak memberikan jaminan akurasi. Jika Anda memperlambat CPU, beberapa penghitung waktu akan diaktifkan lebih lambat dari yang dijadwalkan karena tidak bersifat pre-emptive. Namun, jika tugas Anda tidak membutuhkan banyak CPU, maka Anda mungkin baik-baik saja.