Node.jsのタイマーの使用を調査しました。
Javascriptで大量タイマーを利用した場合、普通の実装では、
1
2
3
4
5
6
7
8
| while(true) {
node_js_check_event {
すべてのタイマーを一つずつチェック ===> 一つずつは効率悪い、オプティマイズすべき。
タイムアウト付き、他のイベントをチェック (epollなど)
}
イベントをディスパッチ...
}
|
上記「すべてのタイマーを一つずつチェック」をオプティマイズすべきと思います。
オプティマイズ方法は、B-TREEみたいな構造でタイマーのfireTimeを保存し、
チェックはB-TREEから最小fireTimeだけをチェックすれば終わり。
Node.jsはどのように実装したのか?ソースを見てみると、確かにオプティマイズしました!:
closest timer of all timerstimer.c 120
| RB_MIN(uv__timers, &loop->timer_handles)
|
pass timeout argument to poll apicore.c 276
277
278
279
280
| timeout = 0;
if ((mode & UV_RUN_NOWAIT) == 0)
timeout = uv_backend_timeout(loop);
uv__io_poll(loop, timeout);
|
unixのソースですが、Windows系のソースも似ているロジックが入っています。
最高です。