Mozilla Flux

Mozilla関係の情報に特化したブログです。

JavaScriptエンジンに対するPGOが復活

Firefox 3では、プロファイルを利用した最適化(PGO)と呼ばれる最適化手法によって、パフォーマンスの向上に成功した。これは当然Firefox 3.1にも引き継がれているのだが、いつの時点からか、Windows版でJavaScriptエンジンに対する最適化が効かなくなっていた。後述のとおり、少なくともFirefox 3.1 Beta 2ではそうした状態に陥っていたようだ。

最新のShiretoko(3.1b3pre)では、"Bug 467271 - JS not being PGOed on win32"がチェックインされ、このバグが修正された。つまり、Firefox 3同様にJavaScriptエンジンの処理が最適化されるようになった。

Firefox 3.1では、TraceMonkeyが導入されたため、最適化が復活してもかつてほどのインパクトはない。とはいえ、この修正が入っただけでSunSpiderベンチマークの成績が3%向上したという。

では、ということで、手元の環境でも試してみることにした。ふつうならナイトリービルドを使うのだが、残念なことにビルドにエラーが出ており、この修正を含んだナイトリーが完成していない。そこで、Hourly Build(ID:20090122113319)を使うことにした。

まずは、比較対象を挙げておこう。Firefox 3.0.5、Firefox 3.1 Beta 2に加え、直近のナイトリービルド(Shiretoko/3.1b3pre, ID:20090121034454)でもあらかじめSunSpiderで数値を計測しておいた。TraceMonkeyは最適化が働かないことによるマイナスをカバーしてしまうので、JITをオフにしたケースも調べた。

比較対象の成績は以下のとおり。
3.0.5: 6629.4ms +/- 1.0%
3.1b2: 2432.6ms +/- 0.9%(JITあり)
3.1b2: 6417.2ms +/- 0.3%(JITなし)
b3pre: 2330.0ms +/- 0.6%(JITあり)
b3pre: 6006.2ms +/- 1.2%(JITなし)

Firefox 3.1のJavaScriptエンジンは、TraceMonkey以外にも改良が多数加えられているはずなのに、Beta 2でJITなしの場合の成績が振るわない。このことから、Firefox 3では効いている最適化が、3.1 Beta 2の時点では効かなくなっていたのだろうと推測できる。

これに対し、バグ修正後の最新版Shiretokoは明らかにスピードアップしている。
b3pre: 2264.0ms +/- 0.6%(JITあり)
b3pre: 5685.8ms +/- 0.6%(JITなし)
TraceMonkeyがオンのときは報告どおり3%速くなった。オフのときはさらに顕著で、5〜6%も速い。最適化の威力が発揮された、良好な結果といえよう。

ちなみに、最適化に使用されるプロファイルを改良したパッチもできあがっている(Bug 472706)。Beta 3には間に合わないかもしれないが、遅くともRC1ではプログラム全体のパフォーマンスが引き上げられるはずだ。Firefox 3.1の高速化に向けた動きからは、まだまだ目が離せない。