UbuntuのパッケージとMozilla版それぞれのFirefoxのビルド時のオプションと快適さなどについて(バージョン27時点)
UbuntuのパッケージとMozilla版のビルド時のオプションの比較
Ubuntuのパッケージのバージョン27のビルド時のオプション
Ubuntuのディストリのパッケージとして提供されているFirefoxのビルド時の最適化オプションがふと気になったので、about:buildconfigで調べてみた。
項目 | 値 |
---|---|
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版バイナリについて、ビルド時のオプションを同様に調べてみた。
項目 | 値 |
---|---|
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とこれに関係したGCCのオプション指定について
PGOは「実際にプログラムを動かし、そのときの動かし方にプログラムを最適化する」という手法で、時間と手間がかかる一方で動作速度の向上が図れる。
1回目のビルド
「各ソースファイルのコンパイル時」と「リンク時」の両方に-fprofile-generateオプションを付けることにより、プログラム実行時にプロファイルのファイル群を書き出すよう変更を加える(これを「インストゥルメント」と呼ぶ)。
-fprofile-generate=[出力先]指定でファイルの出力先ディレクトリを指定することもできる(出力先指定なしの場合は各ソースのファイルと同じディレクトリになる)。
Mozilla版Firefoxの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オプションを付けるとエラーで止まる代わりに警告が出るようになるが、それでビルドが通っても最適化の度合いは落ちる。
Mozilla版Firefoxのabout:buildconfigでは-fprofile-useと-fprofile-correctionのオプションが確認でき、PGOによる最適化がされたものであると分かる。
Firefoxのビルド時の手順
- ソースの最上位ディレクトリに「ac_add_options --enable-application=browser」を含み「ac_add_options --disable-tests」を含まない.mozconfigを作成
- 同ディレクトリで「make -f client.mk profiledbuild」を実行
以下は余談。
以前試してビルドエラーになったことがあったのでこの機会に試してみたのだが、残念ながら1回目のビルドのlibxul.soのリンクでメモリが不足し、スワップの読み書きがされるだけになって処理が進まなくなったために断念した。ソースの規模も前回ソースからビルドした数年前と比べ非常に大きくなっており、当時(Athlon64を使用)よりCPUが高速になったにも関わらずビルド時間はむしろ長くなっていて、それに加えて新バージョンが出るペースが上がっていることもあり、個人的にはFirefoxをソースからビルドすることは今後しない意向。
関連URL: