![]() |
Firefox web browser - Faster, more secure & customizable |
Mozilla JavaScriptチームのDavid Mandelin氏がJavaScript speedups in Firefox 3.6にて、Firefox 3.6で取り組んだJavaScriptの高速化技術についてまとめている。どういった方策で高速化が実施されたのかがまとまっていて参考になる。紹介されている内容は次のとおり。
Firefox 3.5の高速化と3.6へ向けた課題
Firefox 3.5ではTraceMonkeyと呼ばれる新しいJavaScriptエンジンが導入された。これは特にループ処理のようにJITで高速化が見込みやすい部分をトレースしてネイティブコードに変換するというもの。Firefox 3.0と比較して平均で3倍から4倍の高速化が実現されたという。
しかしFirefox 3.5のJITには課題も多い。まず、トレースする対象が限られているため、JITが実行されずに高速化されない部分が多い。また、Firefox UIで使われているJavaScriptはトレースの対象になっていないし、アドオンのJavaScriptも対象になっていない。より多くのJavaScriptをトレースしてJITでネイティブコード化すればより高速化できる。またJavaScriptベースのアニメーションの動作にムラがあるため、改善する必要がある。
Firefox 3.6改善: JIT対象をUIとアドオンにも拡大
FirefoxのJavaScriptは大きく分けて2つの場所に分類される。contentとchromeだ。contentはウェブコンテンツに含められているJavaScript、chromeはUIやアドオンに含められているJavaScriptだ。chromeにおけるバグはセキュリティや信頼性に直接影響するため、Firefox 3.5ではcontentに対してのみJITが有効になっている。
Firefox 3.6では試験を経て、contentに対してJITを有効にしても大丈夫だと判断。3.6ではUIに対してもJITが有効になる。FirefoxのUIは従来のJavaScriptエンジンでも効果がでるように製作されているため効果を感じることは少ないかもしれないが、JavaScriptを多用しているアドオンでは効果が見られやすいという。
Firefox 3.6改善: GCポーズ時間の短縮
JavaScriptではガベージコレクタが定期的に実行され利用されていないメモリを開放している。GC実行中はすべてのJavaScriptが停止されるため、JavaScriptでアニメーションを実施している場合には一瞬画面が止まるような描画が実施されてしまう。Firefox 3.6では次のふたつの方法でGCポーズ時間の短縮を実現している。
- freeコールで多大な時間が使われていることがわかったため、JavaScriptスレッドからは利用しなくなったメモリチャンクを待ち行列に追加する処理のみを実施するようにし、開放については他のスレッドからアイドル時間中や、ほかのプロセッサから実施するように変更。特にマルチコアシステムではこの効果の恩恵を受けやすい
- 従来の実装ではGCとJITがお互いに別々に動いていた。Firefox 3.6ではGCとJITを連動して動作させることで、GCがキャッシュやネイティブコードをクリアしてしまわないように変更した
Firefox 3.6改善: トレース対象の追加
JITでネイティブコードに変換できるかどうかが、JavaScript実行速度高速化の要といえる。Firefox 3.6では新たにDOMプロパティや、より多くのクロージャ、arguments、switchもトレースの対象とした。この結果JavaScriptの処理が従来の実装よりも高速化され、特にjQueryやDromaeoで効果が見られる。
Firefox 3.6改善: 文字列と正規表現処理の高速化
従来の文字列処理から、大きなバッファを用意してそこに文字列をコピーしてまとめるといった処理へ変更。随時文字列の結合を実施する従来の実装よりも文字列結合の実行速度が改善している。またより多くの正規表現クラスをJITコンパイラで処理できるように改善した。
Firefox 3.7以降での改善
- 再帰処理をトレースしてJIT対象とする。現在の実装では再帰処理はJITの対象にならない。さらに将来はお互いに関数を呼び合う種類の再帰処理もJIT可能にする
- TraceMonkeyのバックエンドであるnanojitの改善。Adobe、Mozilla、Intel、Sunが継続してメモリ利用、トレースコードとコンパイルの高速化、ネイティブコードの高速化に取り組んでおり、TraceMonkeyそのものの性能改善が期待できる
- nanojitでAMD x64コードに対応
Firefox 3.6はFirefox 3.5よりも高速化されている。実際に使ってみるだけでも軽快さを体感できるほど。ただしそれでもChromeやSafariの方が高速化の面では先行している。また、開発中のOperaがChromeを超える高速化を実現したという報告もあり、主要ブラウザの中では抜きん出て高速というわけではない。