Mozilla Flux

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

Firefox 31のベンチマーク結果 Webアプリの処理性能を重視か

当ブログでは、Firefoxの延長サポート版(ESR)のベースが更新される時期を節目とみて、ベンチマークの測定結果を公開している。ESRの新たなベースとなるFirefox 31がまもなくリリースされる見込みなので、今回はFirefox 24と比較してみたい。

使用するのは、32bit版のFirefox 24.6.0とFirefox 31.0 RC2である。後者はリリース候補版だが、そのまま正式版になるとみられる。ユーザーエージェント文字列は以下のとおり。

  • Firefox 24:Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
  • Firefox 31:Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0

動作環境が前回から大きく変更されているので注意してほしい。OSはWindows 8.1 Update 1(64bit版)で、使用したハードウエアは、CPUがIntel Core i7 4800MQ 2.70GHz、GPUがIntel HD Graphics 4600(ドライバのバージョン:10.18.10.3338)、メモリ容量が16.0GBである。テストの際は、新規プロファイルを(フォントをメイリオに変更する以外は)初期設定のまま利用し、アドオンをすべて無効化し、プラグインもShockwave Flash 14.0 r0以外を無効化した。各ベンチマークの実行後はFirefoxを終了させて、メモリ上に前のベンチマークが残らないように配慮している。

なお、対象となるベンチマークは、今回も一部を入れ替えた。

ページの読み込み速度およびメモリ使用量

10のWebサイトを同時に開いて、読み込み中であることを示すアイコン(throbber)が消えるまでの時間を手動で計測した(秒数の小数点以下は切上げ)。同時に、10サイトを表示させた場合と、単サイトを表示した場合のメモリ使用量もチェックした。

具体的な手順は、次のとおり。以下の10サイトをその記載順にブックマークしたバックアップファイル(JSON形式)をインポートし、「タブですべて開く」で10サイトをいっせいに読み込む。throbberが消えるまでの時間を計測し、完了したらFirefoxのホームページは閉じ、各タブをクリックしてWebページを実際に画面に表示させる。つまり最後に表示されるのはWikipedia(日本語版)になる。

1分間そのまま放置した後、新しいタブを開き、about:memoryを呼びだして"Show memory reports"のMeasureボタンをクリックし、residentの値を見る。従来はExplicit Allocationsの値を見ていたのだが、MozillaのNicholas Nethercote氏によれば、メモリ使用量を簡潔に示す単一の指標としては、residentの値が最も優れているという。本記事でもresidentの値を採用することにした。

「他のタブをすべて閉じる」でYahoo! JAPAN以外のWebページはすべて閉じる。1分間そのまま放置した後、再び新しいタブを開き、about:memoryを呼びだしてresidentの値を見る。Firefoxをいったん終了させ、再起動後に上記10サイトを同じ手順で開いて、throbberが消えるまでの時間を計測する。一連の手順を実行した結果がこれだ。

Firefox 24 Firefox 31
読込時間(1回目) 12 秒 12 秒
読込時間(2回目) 10 秒 10 秒

Firefox 24 Firefox 31
使用メモリ(10サイト) 295.98 MB 331.31 MB
使用メモリ(単サイト) 219.39 MB 250.09 MB

読み込み速度には全く差が見られなかった。ある程度高速なPC環境では、性能が頭打ちになっているのかもしれない。なお、新しいHTTPキャッシュシステム(cache v2)がデフォルトでオンになるのはFirefox 32からなので、今回はテストしていない。

一方、メモリ使用量はFirefox 31のほうが多いという結果になった。起動時に作成されるシステムコンパートメントが増加したという話も出ており、最低限使用するメモリの差が出たか。また、不要になったメモリの解放についても、世代別ガベージコレクション(Generational GC)が、動作を不安定にするとの理由で、Firefox 31 Betaの段階でオフにされており、こちらで挽回することもできなかった。

動的ページの処理

GUIMark 2Text Column Testを使用して、秒間フレーム数(FPS)を調べた。なお、GUIMark 3のHTML5 Vectorは他のベンチマークと重複するので外すことにした。

Firefox 24 Firefox 31
Text Column Test 25.5 fps 56.52 fps

Firefox 31の圧勝だが、これはFirefox 24にバグ(Bug 921858)があったことが原因である。つまりFirefox 31で高速化したのではなく、(ほぼ)元の水準に戻ったわけだ。

レイアウトおよび描画処理

CanvasMark 2013

CanvasMark 2013 version 1.1は、HTML5ゲームでよく使用される処理(ビットマップ、Canvas描画、αブレンディングなど)に対するレンダリングパフォーマンスをテストする。なお、Canvas Performance Benchmarkは若干古くなったので外すことにした。

Firefox 24 Firefox 31
CanvasMark Score 10335 10228

わずかながらFirefox 31のスコアが低下している。

CSSレイアウト処理

Internet Explorer 11 Test DriveからMaze Solverをピックアップし、迷路のサイズを30×30に設定してテストを実行した。このテストは、WebブラウザがCSS 2.1およびCSS 3ベースのレイアウト構築を処理する性能に焦点を当てており、数値が小さいほど高速である。

Firefox 24 Firefox 31
Browser Score 8.8 秒 9.7 秒

どちらも高速に処理されているが、やはりわずかにFirefox 31の成績が悪い。

FishGL

Internet Explorer 11 Test DriveからFishGLをピックアップし、水槽内の魚の数を150匹に設定してテストを実行した。 このテストは、WebGLに関する処理性能を測定するものだ。

Firefox 24 Firefox 31
秒間フレーム数 40 - 43 fps 44 - 45 fps

Firefox 31のほうが若干FPSは高いものの、テスト中、PCのファンの音がより大きくなる印象を受けた。ちなみに、魚の数を200匹にしなかったのは、FPSが突然低下する現象が起きたためである。グラフィックスドライバとの相性問題かもしれないが、動作の安定性が気になる。

JavaScript/DOM処理

代表的なベンチマークを利用して、JavaScript/DOMを中心とした処理能力を測る。今回は、若干古くなったKraken JavaScript BenchmarkとDromaeoをを外すことにした。なお、JetStream 1.0は、Firefox 31でエラーが生じるため採用を見送った。

Octane

Octane JavaScript Benchmark は、V8 Benchmark Suiteの後継となるベンチマークで、モダンなWebアプリケーションを実行した場合の性能を反映した結果になるという(FAQ)。v1では実行スループットに焦点を当てていたが、v2では低レイテンシも同様に重要であるとの観点からベンチマークの内容の見直しが図られた。

Firefox 24 Firefox 31
Octane Score 23094 24943
Richards 29343 29445
Deltablue 28358 23055
Crypto 24804 26020
Raytrace 37510 27500
EarleyBoyer 31153 32348
Regexp 1961 2476
Splay 17304 19256
SplayLatency 10731 12737
NavierStokes 27695 30095
pdf.js 16679 19584
Mandreel 26877 30869
MandreelLatency 42609 46159
GB Emulator 50799 49699
CodeLoad 21174 19714
Box2DWeb 29278 40203
zlib 58393 59415
Typescript 17689 29847

Firefox 31が8%程度スコアを伸ばした。Box2DWebやTypescriptなど、一部の項目で大幅に改善がみられた点が影響している。低レイテンシという観点でも、Firefox 31に分があるようだ(SplayLatencyとMandreelLatencyの項目参照)。

Speedometer

Speedometer 1.0は、WebKitチームが開発した新しいベンチマークで、DOMオブジェクトの操作に焦点を当て、Webアプリの応答性を測定する。jQueryなど6つのポピュラーなJavaScriptフレームワークを採用し、ユーザーの行動をシミュレートするという。

Firefox 24 Firefox 31
Runs / Minute 66.51 ± 0.50 69.44 ± 0.48

4%強とそれほど差は大きくないものの、Firefox 31のほうが高いスコアとなった。

asm.js

Firefoxは、OdinMonkeyと呼ばれるAOT(Ahead Of Time)コンパイラを搭載している。OdinMonkeyは、asm.jsをバイトコード生成前の抽象構文木(AST)から一挙にIonMonkey向け中間表現(MIR)へと変換し、このMIRはコンパイル後、Baselineに差し戻されることがないため、全体として処理が高速化される。そして、asm.jsは主にEmscriptenによってネイティブコードから生成される。

そこで、Emscriptenプロジェクトの一環として公開されているベンチマーク・スイートEmbenchen v0.0.2を利用して、asm.jsの処理性能を見てみよう(参考記事)。このベンチマーク・スイートは、マイクロベンチマークとマクロベンチマークから構成されるが、性能の指標としては実環境に近い後者が重要となるので、本記事でもマクロベンチマークの結果を掲載する。なお、数値が小さいほど高速である。

Firefox 24 Firefox 31
box2d 8742 ミリ秒 8807 ミリ秒
bullet 9741 ミリ秒 9542 ミリ秒
lua_binarytrees 5779 ミリ秒 5436 ミリ秒
zlib 9264 ミリ秒 8750 ミリ秒

おおむねFirefox 31のほうが好成績であり、asm.jsの処理性能が向上しているのが見てとれる。

HTML5/JavaScript処理

以下は、総合的なベンチマーク・スイートを走らせた結果である。

Canvas Cycle

Canvas Cycleは、HTML5 Canvas上に8bitのカラーパレットを用いたアニメーションを表示し、サウンドも鳴らすデモだ(解説)。オプションを表示させると秒間フレーム数(FPS)が出るので、"Jungle Waterfall - Morning"を初期設定のまま走らせてみた。

Firefox 24 Firefox 31
秒間フレーム数 102 - 107 fps 93 - 99 fps

Firefox 31のFPSが若干低下している。他のテスト結果と照らし合わせると、描画関係に何らかの問題を抱えている可能性も考えられる。

enchant.js

4Gamer.net「『enchant.js』でゲームはどれくらい動くのか? HTML5でゲームベンチマークを取ってみよう」掲載のベンチマークを利用し、100秒間のフレームレートの合計値を測定した。

Firefox 24 Firefox 31
Score 12546 11266

やはりFirefox 31でパフォーマンスの低下が見られる。

Impact HTML5 Benchmark

Impact HTML5 Benchmarkは、Mozillaの開発者が作成した2Dアクションゲーム風のベンチマークで、解説によれば、スコアを算出する際、処理の中断があると大きなペナルティがつくようになっている。つまり、レンダリングに加えてガベージコレクションの能力も問われるわけだ。

Firefox 24 Firefox 31
Score 10370 10873
Total CPU Time 8.30 秒 7.56 秒
Total Lag 53 ミリ秒 50 ミリ秒

Firefox 31のスコアがFirefox 24を上回った。Total Lagの数値からすると、インクリメンタルGCも改良されているようだ。

Peacekeeper

Peacekeeperは、Futuremarkが提供する重量級のベンチマーク。多角的かつそこそこ信頼性の高いものを探すとなると、今なおこのベンチマークは外せない。

Firefox 24 Firefox 31
Points 3243 3896

意外なほどFirefox 31がリードしている。項目別に見ると、RenderingやHTML5 Canvasでは多少上回る程度だが、DOM operationsとText parsingで大差を付けており、それが総合ポイントに反映されている。

Browsermark

Browsermark 2.1は、Rightwareが提供する総合ベンチマークで、実環境のパフォーマンスを計測することに焦点を当てているという。計測の対象は、CSS、DOM、グラフィックス、JavaScriptなど。なお、2.1のスコアは2.0のものと互換性がない。

Firefox 24 Firefox 31
Score 4165 4685

Peacekeeperと同様に、Firefox 31の伸びが大きい(約12.5%)。どうやらFirefox 31は、個別のパーツの性能ではなく、総合的な性能で勝負するタイプらしい。

RoboHornet

RoboHornet RH-A1は、Benchmark.jsベースの総合ベンチマークで、α版だが完成度は高い(FAQ)。今回は、標準的なCore Suiteを選んで計測した。

Firefox 24 Firefox 31
RoboHornet index 134.01 116.01
Add Rows to Table 8.53 9.08
Add Columns to Table 5.02 4.85
Descendant Selector 36.72 37.34
2D Canvas toDataURL 5.00 5.12
2D Canvas clearRect 3.88 3.89
innerHTML Table 4.99 6.45
Table scrolling 5.79 8.70
Resize columns 9.36 9.64
Object Scope Access 3.69 3.54
ES5 Property Accessors 2.29 2.32
Argument instantiation 4.69 4.09
Animated GIFS 1.79 0.53
offsetHeight triggers reflow 1.62 1.49
DOM Range API 5.55 5.74
Write to localStorage 20.43 7.92
Read from localStorage 14.69 5.31

総合成績だけだとFirefox 31がずいぶん悪いように見えるが、個別の項目では改善されている箇所も多い。ただ、Firefox 24で異様に高い数値を叩き出していたlocalStorage関係の項目が振るわなくなったため、全体の足を引っ張っている。

総合評価

テストによって結果にばらつきがあるため、どれだけ性能が向上したかを評価するのは難しい。Australisというユーザーインターフェイスの全面的な刷新を挟む中で、進歩を維持しているのは立派ともいえるが、やや物足りない感は否めない。

おぼろげながら浮かび上がってきたのは、Mozillaが、Webページの処理性能ではなく、Webアプリの処理性能を重視した改良を加えてきているという点だ。もちろん、両者はかなりの部分重複するわけだが、Webアプリを利用したときにユーザーが快適だと思うかどうかは、動作の安定性など他の要素にも強く影響されると思われる。バランスの難しい領域に入りつつあるようだ。

次のFirefox ESRはバージョン38がベースとなる。31に間に合わなかったいくつかの機能が追加されることは確実だが、アーキテクチャの革新にも期待したいところだ。