Technology of SJI

株式会社SJIの技術ブログ

Node.jsは予想通りオプティマイズされたか? (大量タイマー)

| Comments

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系のソースも似ているロジックが入っています。

最高です。

Comments