試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

UbuntuのパッケージとMozilla版それぞれのFirefoxのビルド時のオプションと快適さなどについて(バージョン27時点)

UbuntuのパッケージとMozilla版のビルド時のオプションの比較

Ubuntuのパッケージのバージョン27のビルド時のオプション

Ubuntuのディストリのパッケージとして提供されているFirefoxのビルド時の最適化オプションがふと気になったので、about:buildconfigで調べてみた。

Ubuntuのパッケージのバージョン27のオプション(x86_64版)
項目
GCCのバージョン4.8.1-10ubuntu8
gccのオプション-Wall -Wpointer-arith -Wdeclaration-after-statement -Werror=return-type -Wtype-limits -Wempty-body -Wsign-compare -Wno-unused -Wcast-align -std=gnu99 -fgnu89-inline -fno-strict-aliasing -fno-math-errno -pthread -pipe -DNDEBUG -DTRIMMED -g -Os -freorder-blocks -fomit-frame-pointer
g++のオプション-Wall -Wpointer-arith -Woverloaded-virtual -Werror=return-type -Wtype-limits -Wempty-body -Wsign-compare -Wno-invalid-offsetof -Wcast-align -fno-exceptions -fno-strict-aliasing -fno-rtti -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -pipe -DNDEBUG -DTRIMMED -g -Os -freorder-blocks -fomit-frame-pointer
configureスクリプトのオプション--host=x86_64-linux-gnu --prefix=/usr --libexecdir=/usr/lib/firefox --with-l10n-base=/build/buildd/firefox-27.0+build1/./l10n --srcdir=/build/buildd/firefox-27.0+build1/. --disable-install-strip --disable-updater --enable-application=browser --enable-startup-notification --with-distribution-id=com.ubuntu --enable-optimize --enable-tests --enable-crashreporter --with-branding=browser/branding/official --disable-gnomevfs --enable-gio --enable-update-channel=release --disable-debug --disable-elf-hack

Mozilla版のバージョン27のビルド時のオプション

ftp.mozilla.org/pub/mozilla.org/mozilla.org/firefox/releases/27.0/linux-x86_64/ja/
にあるバージョン27のx86_64版バイナリについて、ビルド時のオプションを同様に調べてみた。

Mozilla版のバージョン27のオプション(x86_64版)
項目
GCCのバージョン4.7.3
gccのオプション-Wall -Wpointer-arith -Wdeclaration-after-statement -Werror=return-type -Wtype-limits -Wempty-body -Wsign-compare -Wno-unused -Wcast-align -Wno-error=uninitialized -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -std=gnu99 -fgnu89-inline -fno-strict-aliasing -ffunction-sections -fdata-sections -fno-math-errno -pthread -pipe -DNDEBUG -DTRIMMED -g -fprofile-use -fprofile-correction -Wcoverage-mismatch -O3 -fomit-frame-pointer
g++のオプション-Wall -Wpointer-arith -Woverloaded-virtual -Werror=return-type -Wtype-limits -Wempty-body -Wsign-compare -Wno-invalid-offsetof -Wcast-align -Wno-error=uninitialized -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -fno-exceptions -fno-strict-aliasing -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -std=gnu++0x -pthread -pipe -DNDEBUG -DTRIMMED -g -fprofile-use -fprofile-correction -Wcoverage-mismatch -O3 -fomit-frame-pointer
configureスクリプトのオプション--enable-update-channel=release --enable-update-packaging --with-google-api-keyfile=/builds/gapi.data --enable-crashreporter --enable-release --enable-elf-hack --enable-stdcxx-compat --enable-warnings-as-errors --enable-official-branding

最適化オプションの比較

-Osと-O3

GCC-O[数字かs]の最適化オプションの内、Ubuntuのパッケージでは-Os(標準的な最適化オプション-O2の指定から、機械語ファイルのサイズが小さくなるように幾つかのオプションを除いたもの)が用いられているが、Mozilla版ではより最適化レベルの高い-O3オプションが用いられている。

PGO

Mozilla版ではProfile-guided optimization (PGO)と呼ばれる最適化が有効になっているが、Ubuntuのパッケージでは有効になっていない(オプション指定などについては後述)。

体感差

Mozilla版はあまり使ったことがなかったが、今回試しに動かしてみたところ、上記の2つの違いがあったこともあり、動作が軽くなっているのを実感できた。Ubuntuのパッケージが今後これら2つについてMozilla版と同じようにビルドされるようになるまではMozilla版を使うことになりそう。

関連:PGOとこれに関係したGCCのオプション指定について

PGOは「実際にプログラムを動かし、そのときの動かし方にプログラムを最適化する」という手法で、時間と手間がかかる一方で動作速度の向上が図れる。

1回目のビルド

「各ソースファイルのコンパイル時」と「リンク時」の両方に-fprofile-generateオプションを付けることにより、プログラム実行時にプロファイルのファイル群を書き出すよう変更を加える(これを「インストゥルメント」と呼ぶ)。
-fprofile-generate=[出力先]指定でファイルの出力先ディレクトリを指定することもできる(出力先指定なしの場合は各ソースのファイルと同じディレクトリになる)。
MozillaFirefoxのabout:buildconfigでは1回目のビルド時にのみ付く-fprofile-generateオプションは確認できないが、これは2回目のビルド時に付く後述のオプションのみがabout:buildconfigに出るため。

実行

実行ファイルができたら、最適化させたい動かし方でそれを実行する。これにより、自動的にプロファイルのファイル群(*.gcda)が書き出される。最適化させたい動かし方が複数あればその分だけ動かす。
Firefoxを後述の手順でビルドする場合はbuild/pgo/profileserver.pyが自動的に実行される。動かし方をカスタマイズするには、このスクリプトか、これを呼び出す記述を含むtesting/testsuite-targets.mkの「pgo-profile-run」ターゲットを編集する。

2回目のビルド

「各ソースファイルのコンパイル時」と「リンク時」の両方に-fprofile-useオプションを付ける。
-fprofile-use=[出力先]指定で.gcdaファイルの探索ディレクトリを指定することもできる。
マルチスレッドのプログラムではプロファイルのファイルが正しく書き出されないことがあり、それを修正して用いるために-fprofile-correctionオプションも付ける。
プロファイルのファイルが生成された後でソースが修正されたときなど、プロファイルのファイルがソースファイルに正しく対応していない場合にはエラーが発生し、-Wcoverage-mismatchオプションを付けるとエラーで止まる代わりに警告が出るようになるが、それでビルドが通っても最適化の度合いは落ちる。
MozillaFirefoxのabout:buildconfigでは-fprofile-use-fprofile-correctionのオプションが確認でき、PGOによる最適化がされたものであると分かる。

Firefoxのビルド時の手順
  1. ソースの最上位ディレクトリに「ac_add_options --enable-application=browser」を含み「ac_add_options --disable-tests」を含まない.mozconfigを作成
  2. ディレクトリで「make -f client.mk profiledbuild」を実行

以下は余談。
以前試してビルドエラーになったことがあったのでこの機会に試してみたのだが、残念ながら1回目のビルドのlibxul.soのリンクでメモリが不足し、スワップの読み書きがされるだけになって処理が進まなくなったために断念した。ソースの規模も前回ソースからビルドした数年前と比べ非常に大きくなっており、当時(Athlon64を使用)よりCPUが高速になったにも関わらずビルド時間はむしろ長くなっていて、それに加えて新バージョンが出るペースが上がっていることもあり、個人的にはFirefoxをソースからビルドすることは今後しない意向。

関連URL: