Mozilla Flux

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

about:buildconfigと最適化の話

Firefox 3.1のナイトリービルド(現時点では3.1b3pre)は、Hourlyビルドと比べてコンパイラの設定を変えているのか。以前そんな疑問が浮かんだのだけれど、「about:buildconfig」とロケーションバーに打ち込んで確かめればいいということに気づくまで、しばらくの期間を要してしまった。

結論から先に言うと、コンパイラの設定はまったく同じ。ビルドオプションにも違いはない。では、Firefox 3の安定版とではどうだろう。あるいは、Firefox 3.1のβ版とでは?

まずは、Firefox 3.0.5のロケーションバーから「about:buildconfig」をチェック。関係のある個所を抜粋すると、Windows版では次のようになる。

Build tools

Compiler Version Compiler flags
cl 14.00.50727.762 -GL -wd4624 -wd4952 -TC -nologo -W3 -Gy -Fd$(PDBFILE)
cl 14.00.50727.762 -GR- -GL -wd4624 -wd4952 -TP -nologo -Zc:wchar_t- -W3 -Gy -Fd$(PDBFILE)

Configure arguments

--enable-application=browser --enable-update-channel=release --enable-optimize --disable-debug --disable-tests --enable-update-packaging --enable-official-branding --enable-jemalloc --with-crashreporter-enable-percent=10

これに対し、3.1 Beta 2ではいろいろ設定が変わっている。そして、重複になるので載せないが、Shiretoko(3.1b3pre)も"Configure arguments"の項目が多少違う(アップデートを提供するチャンネルなど)だけで、ほかは同一だ。

Build tools

Compiler Version Compiler flags
cl 14.00.50727.762 -TC -nologo -W3 -Gy -Fdgenerated.pdb -DNDEBUG -DTRIMMED -Zi -UDEBUG -DNDEBUG -GL -wd4624 -wd4952 -O1
cl 14.00.50727.762 -GR- -TP -nologo -Zc:wchar_t- -W3 -Gy -Fdgenerated.pdb -DNDEBUG -DTRIMMED -Zi -UDEBUG -DNDEBUG -GL -wd4624 -wd4952 -O1

Configure arguments

--enable-application=browser --enable-update-channel=beta --enable-update-packaging --enable-jemalloc --enable-official-branding

Firefoxには、それ自体のビルドオプションと、コンパイラに与えるコンパイラオプションという二つの設定がある(ITmediaエンタープライズの記事参照)。単純化すれば、ビルドオプションはプログラム全体の仕上がりに関する指示で、コンパイラオプションはプログラムの部品とその組立てに関する指示といえるだろう。about:buildconfigの画面では、"Compiler flags"にコンパイラオプションが、"Configure arguments"にビルドオプションがそれぞれ表示されている。

とくにコンパイラオプションは、ややこしい設定の羅列だ。Webで検索すると、「cl(VC6)オプション - C/C++ COMPILER OPTIONS」やMicrosoftが出した「最適化の推奨事項」といった文書がヒットするのだが、それらと照らし合わせても一部の設定のことしかわからない。「Compiler Options」はもっと詳しいようだが、その一覧にも出ていない設定は独自のマクロだろうか。だとしたらお手上げだ。

とりあえず、PGO (Profile-Guided Optimization:プロファイルを利用した最適化)が適用されるような指示になっていることと、β版ではデバッグ用の情報が入っていることは確か。3.1での変更点は、残念ながら詳細をつかめなかった。なお、Firefox 3はビルドにVisual Studio 2005を使用しているが、about:buildconfigの"Version"から、3.1のコンパイラも同じだとわかる。

また、ビルドオプションについても、"Configuring Build Options"という公式の説明書があるにはあるものの、あまり突っ込んだことは書いていなかった。筆者が知りたいのは、たとえば、Firefox 3のビルドオプションに「--enable-optimize」とあるけれど、これとコンパイラオプションにおける最適化の指示がどう関係するのかといったこと。3.1 Beta 2のビルドオプションに「--enable-optimize」は見当たらない一方、コンパイラオプションには最適化の指示が含まれている(-GL)。3.1正式版がリリースされるときに「--enable-optimize」が付加されると、同じコードをベースにしたShiretokoよりもさらに速くなるのか?

よくわからないことだらけだ。別の見方をすれば、そういう難しい内容だからこそ、いろいろ研究してFirefoxの独自ビルドを作る人たちが出てくるのだろう。さらに言えば、設定をいじって高速化を目指す人がいるくらいだから、Firefoxの公式ビルドでは、あまり細かくコンパイラの設定を定めていないはずだ。そこには、詳細な設定が逆効果になるという判断がある。IntelのCPUを搭載したPCでは速いが、AMDのCPUだと遅いのでは困るということだ。

しかし、上に挙げたPGOは、この限界を打ち破るために考案された最適化技法といえる。「Microsoft Visual C++ 2005でのPGO」によれば、PGOを適用した場合、コンパイラはいったん生成したプログラムを試験的に実行してデータを収集。そのデータ、すなわちプロファイルを利用してコードを最適な形でコンパイルし直すという。試験環境を実際の動作環境に合わせれば、チューニングされたプログラムは実環境でも高速に動作することになる。

Firefox 3でこのPGOは採用済みだ。試験実行の段階でどの機能が最もよく使われるのかをチェックし、最終的なプログラムではその部分の処理を最適化する。開発版でこの技術が導入されたとき、JavaScriptのテストは約11%高速化したそうだ。

試験実行は、実際にどのような形で行われているのだろう。"Bug 472706 - add better profiling input for spidermonkey in PGO builds"での説明を見ると、ごく単純なものでしかなく、軽く驚かされる。Firefoxを起動し、ほぼ空のHTMLページを読み込ませて、数秒後に終了する。たったそれだけだ。

現在、より適切と思われる処理手順ができあがっており、Trunk(3.2a1pre)では既に適用されている。プロファイルを強化するその処理手順とは、Blueprintのテストページをいくつかと、SunSpiderベンチマークのテストページを組み込むというもの。ベンチマークに特化した最適化を施すのはフェアではないとする向きもあるだろうが、ベンチマークが主要な処理を網羅しているなら、広くユーザー全体が最適化の恩恵を受けられる。決して悪いことではない。

新プロファイルの効果は、まだきちんと測定されていない。いちおう開発者が行った簡単なテストでは、コンテンツの処理速度が10〜20%アップしたらしい。そこで明らかになったのは、従来の手順でPGOを適用すると、かえってスピードが落ちていた部分があったかもしれないという事実だ。興味深い結果であると同時に、チューニングのバランスを取ることの難しさも感じさせる。

ただ、プロファイルの変更がFirefoxの動作を不安定にしているのではないかとの指摘もある。この懸念が払拭されさえすれば、Firefox 3.1は新プロファイルによって最適化されるだろう。ぜひそうなってほしいところだ。