最新のShiretoko(3.1b3pre, ID:20090303040349)では、"Bug 479109 - TM: Improve blacklist"や"Bug 477576 - Excessive memory peak with the Dromaeo string test"などが修正され、V8ベンチマークやDromaeoベンチマークでの成績が大きく向上した。
それだけなら嬉しいニュースなのだが、残念なことに反動が出てしまった。SunSpiderベンチマークでのスコアがガタ落ちしたのだ。"Bug 481103 - TM: Dromaeo v3 Sunspider massive slowdown after 2-28 merge"として既にバグが報告されている。
TraceMonkeyはいまだ開発途上にあり、今後チューニングが進めば、こうしたアンバランスは解消されていくだろう。しかし、問題は、このタイミングでFirefox 3.1 Beta 3がコードフリーズになる点にある。つまり、Beta 3は、SunSpiderベンチマークで結果が出せない状態でリリースされてしまう。筆者の環境では、Beta 2よりもスコアが悪い(『JavaScriptエンジンに対するPGOが復活』参照)。最初に調べたとき我が目を疑い、Shiretokoをクリーンインストールし直したが、変わらなかった。
SunSpiderは、IT関係のメディアでよく使われるベンチマークだ。Beta 3がリリースされた後、当然多くのメディアがこのベンチマークでテストを行うはずである。そこでは、Google ChromeやSafari 4 Public Betaが引き合いに出され、Firefox 3.1に否定的な評価が下される可能性は充分にある。ましてや、Beta 2よりもスコアが落ちたとなれば、よく調べもせずにMozillaの開発力を疑問視する記事も書かれるかもしれない。
以上の懸念の元となったデータをみていこう。まずは、今回の修正によって、V8ベンチマークのスコアは確かに向上した。『Safari 4 Public Betaの実力や如何に』で取り上げたShiretoko(3.1b3pre, ID:20090225031913)と比べてみよう。
20090303 | 20090225 | |
---|---|---|
Score | 141 | 71.0 |
Richards | 142 | 148 |
DeltaBlue | 66.3 | 12.2 |
Crypto | 343 | 36.8 |
RayTrace | 136 | 105 |
EarleyBoyer | 185 | 154 |
RegExp | 97.4 | 119 |
総合スコアが倍になるという大きな進歩だ。ChromeやSafari 4にはまだ遠く及ばないものの、JITがオフの場合よりもスコアが悪くなる現象は解消された。
Dromaeoでもスコアの伸びは顕著で、2.5倍以上の値に達している。ベンチマークを走らせていても、スムーズに進むのを体感できるほどだ。
20090303 | 20090225 | |
---|---|---|
Total | 29.10runs/s ±3.77% | 11.17runs/s ±5.46% |
次は、問題のSunSpiderである。『jit.chrome復活』で取り上げたShiretoko(3.1b3pre, ID:20090227033431)と比較してみる。
20090303 | 20090227 | |
---|---|---|
Total | 2861.0ms +/- 0.8% | 2187.4ms +/- 1.5% |
3d | 482.8ms +/- 4.1% | 291.4ms +/- 1.4% |
access | 554.6ms +/- 0.8% | 291.8ms +/- 3.0% |
bitops | 76.8ms +/- 2.1% | 62.8ms +/- 1.7% |
controlflow | 98.8ms +/- 0.6% | 99.4ms +/- 4.7% |
crypto | 343.0ms +/- 1.8% | 133.0ms +/- 9.4% |
date | 287.2ms +/- 2.7% | 285.6ms +/- 3.1% |
math | 98.2ms +/- 0.6% | 101.0ms +/- 9.1% |
regexp | 148.4ms +/- 6.8% | 147.2ms +/- 13.4% |
string | 771.2ms +/- 0.8% | 775.2ms +/- 1.9% |
一部の数値が非常に悪化しているのが見て取れる。トータルでも約3割ダウンした。不思議なのは、cryptoの項目のように、V8では劇的に向上する一方、SunSpiderでは大きく低下したものがある点だ。似たような処理をしているなら、ここまでの差は出ないはずで、ベンチマークの信頼性ともかかわってきそうだ。
(同日追記)この点については、dynamisさんのコメント参照。
ベンチマーク自体に手が入った可能性はないのだろうか。そう思って、Google Chrome 2.0.166.1(WebKit/530.1)でチェックしてみたのだが、「1533.4ms +/- 2.4%」という結果で、前回計測したときが「1530.6ms +/- 2.2%」だったことから、その可能性は否定された。
念のためJITをオフにした場合も調べたが、こちらもスコアが落ちている。TraceMonkey以外にも何かエンジン内に足を引っ張る原因があるのだろうか。
20090303 | 20090227 | |
---|---|---|
Total | 5779.2ms +/- 0.4% | 5655.4ms +/- 0.7% |
JavaScriptエンジンをチューニングするのがいかに難しいか、浮き彫りになった。後味は悪いが、現実から目を背けることはできない。Beta 4が出るまでの約6週間、Firefox 3.1 Beta 3は厳しい情報戦を強いられることになりそうだ。