たくさんタブを開く人にとってFirefox 5は福音となる…かも

 現在のウェブアプリはHTMLとJavaScriptで構成される。一般的なデスクトップアプリで言うツールキットの部分に相当するのがHTMLである。しかし、この組み合わせでは、デスクトップアプリと比べて取れないイベントが多く、setIntervalで定期的にハンドラを呼び出して状態をチェックする、というテクニックがよく使われる。
 ウェブアプリ側からは自分が今バックグランドタブにいるのか、フォアグラウンドタブにいるのかはわからないため、setIntervalは常に呼ばれている。タブを数十個開いた状態では、バックグラウンドで使いもしないウェブアプリのハンドラが恐ろしい回数呼び出されて、それがCPUを浪費してしまう、という事が起こり得る。
 しかし、この状況はFirefox 5によって変わるかもしれない。ふとどこかで見つけたのだが、FirefoxFlight Trackingというページを眺めていたら、

  • Bug 614733 - Do exponential backoff on background tab refresh drivers
  • Bug 633421 - Clamp setTimeout/setInterval to something higher than 10ms in inactive tabs

 というパッチがチェックインされていることに気づいた。
 これらのパッチは、眺めてみたところによると、前者がバックグラウンドタブでのリフレッシュの回数を指数的に減らすというもので、後者がバックグラウンドタブでのsetTimeout/SetIntervalの粒度を荒くする、というものである。
 リフレッシュというのが具体的にどういう操作なのかはわからないが、なんらかの操作が呼び出されるということはCPUを食うことは間違いないわけで、その操作の回数を指数的に減らすことはCPU使用率の削減に貢献するだろう。
 後者に関しても、ウェブアプリは通常非常に短い単位(10ms〜50msぐらい)でsetIntervalを行っているので、その呼び出し回数を減らすことはCPU使用率に大きな影響があるはずである。
 後者はBug 532904にも同様の内容があるのだが、そちらに書かれているコメントを見ると、「Most of these are doing absolutely nothing I care about other than wasting about 30% of the cycles on one of my CPU cores and draining my laptop battery」とか書いてあって、ああ、2009年から気にしてた人は居たんだなぁと、ちょっと感慨深い。2009年というと、ちょうど私がGoogleのトップページを開くと毎秒100回JavaScriptが実行されるよという記事を書いてディスられたりしていた頃である。
 とは言え、これらのパッチが実際にどれぐらい効くかは試してみるまでわからない。Firefox 5のリリースが楽しみになってきた。