なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

PHPのビルドにはgcc最適化オプションをつける

Linuxを使ってると、ディストリビューションパッケージのバージョンが古かったり、リンクされているライブラリがダメダメだったりして仕方なく自分でビルドするかーってなることがまあまああると思うのですが、何も考えずにビルドするだけではいい感じのバイナリが得られません。

これはPHPに限った話ではないのですが、長時間動かすサーバアプリケーションを自分でビルドするときにはgccの最適化オプションをつけるようにしないと、実行速度が遅くなったり、無駄にCPUを消費する時間が長くなってしまいもったいないです。

デフォルトでいい感じにビルドできればいいのですが、PHPの場合そういうことはなくgccの最適化オプションは自分でちゃんとつける必要があります。 オプションは環境変数、CFLAGSとCXXFLAGSを使って設定しconfigureスクリプトに渡します。

gccの最適化オプションは種類が多いのでとても複雑なオプションを指定しようみたいなことを書いているページもいくつかあるのですが、 複雑であまり効果のないオプションを指定する必要はないので、単に-O2-march=nativeを指定するだけで良いと思います。

export CFLAGS="-O2 -march=native -pipe"
export CXXFLAGS="${CFLAGS}"
./configure (色々ほかのオプション)

-march=nativeコンパイラに特定のCPU向けのコードを生成するように指示するオプション。 このを指定するとCPUの違いで動作しなくなることがあるかもしれないのでバイナリをコピーして使う時には注意が必要です。 ビルドしたマシンと異なるCPUが乗っているマシンにバイナリをコピーして使いたい場合は-march=native外してビルドすれば良いでしょう。

-O2gccの最適化オプションでコンパイル時間がかかるようになり生成されるバイナリは少し大きくなるかもしれませんが、一般に実行速度が速くなるような最適化を実施します。-O2はつけて害になることはまずないので特に動かす頻度の多いPHPのようなものではとりあえずつけておくのがよいでしょう。

ところで、実マシンの実行速度にどれくらい差が出るのかというと、平均で1割程度早くなります。コードによっては2割ほど早くなることもあるので、このあたりのオプションは必ずつけてビルドするようにしておくのがよいでしょう。

もう少し細かい話はGentoowikiあたりを見るといいと思います。

参考

GCCの最適化 - Gentoo Wiki