以下はビルドの様子をキャプチャしたものである。キャプチャを動かしながらなのでいつもより多少時間がかかってしまっているが、それでも31秒台である。自分でコンパイルした時と見比べてみて欲しい。特別速いマシンを利用しているだろって?いやいや、そんなことはない。俺のマシンは以前ブログで紹介したDELL社製のM4500である。Q740)を積んだごく普通のマシンである。OSはエントリにも書いた通りXubuntuだ。ハードウェアは一切変更はない。以前と違うのはOSとソフトウェア、しかも種類が違うのではなくチューニングしただけなのだ!並列コンパイル基本中の基本だが、makeを実行するときは-jオプションでジョブを並列化すると良い。すると並列でコンパイルが実行されるので、時間が短縮される。Threadingに対応しているため、仮想的に8つのCPUコアがOSから認識されている。8というように、8並列でmakeを実行している。スレッド数を増やしてもスラッシングが起きるだけなので、物理または仮想CPUコア数に合わせてジョブの数を調整すると良いだろう。ccacheコンパイルの高速化には、ccacheの利用が欠かせない。ccache"でインストールしておこう。環境変数を次のように設定しておけば、コンパイル時にccacheを利用するようになる。g++'カーネルをコンパイルもし、最近のアーキテクチャのCPUを搭載したマシンを使っているにも関わらず、デフォルトのカーネルを使っているとしたら、今直ぐカーネルを自分でコンパイルしたものに置き換えることをお勧めする。その日からすべてが変わるだろう。自分でコンパイルすると言っても、何も特別なことをする必要はない。Ubuntuの公式ドキュメントに載っているような、ごく有り触れた手順でコンパイルするだけでOKだ。そんなに違うかって??それは、デフォルトのカーネルが新しいCPUに最適化されてないからである。x86_64向けのコードで配布されている。x86_64では、そのような新しい命令を使わずに実行するようになっている。新しいCPUが本来持っている性能を発揮できないのである。x86_64用のバイナリを生成するのは、汎用的なバイナリを配布するために一般的に行われることである。それ自体は悪いことではないのだが、再配布するつもりがない、自分のマシンだけで利用するバイナリを生成するのであれば、genericではなくちゃんと最新のCPU向けに最適化するべきなのだ。持っている新命令をわざわざ使わないなんてことは、もったいないこと極まりない話である。使え!使っちまえってんだチクショウッ!!てなわけで、多少面倒だがカーネルは自分でコンパイルしたものを使おう。するだけで、ソースコードのコンパイルだけでなく、すべての操作が高速化されるからだ。フリーソフトウェア万歳!!オープンソース万歳!!である。menuconfigにて設定を行う。Xeon」を選択しよう。Support」をOFFにしている。実際、筆者のマシンは先に述べたように8コアだし、Numaアーキテクチャではないからだ。カーネルは数千万行からなる巨大なプログラムである。カーネルのコンパイルにはかなりの時間がかかるので、夜寝る前にでも仕掛けておくと良いだろう。libcをコンパイルカーネルをコンパイルするのと同じノリだが、ほぼ全てのプログラムが利用するlibcを自分でコンパイルするのもかなり効く。カーネル以外のパッケージは、作業ディレクトリを掘って次のような手順で作業を行えばオッケーだ。-usdebパッケージをインストールポイントはdebian/rulesファイルの編集だが、BUILD_CFLAGSとHOST_CFLAGSに-march=nativeを追加すればOKだ。libc6もほとんどのアプリケーションの動作に影響を及ぼすので、ソースコードのコンパイルだけでなく日々の作業が快適になる。GCCをコンパイル当然ながら、コンパイラ自身を最適化するというのも有効だ。作業自体は上記のlibcをコンパイルするときと同じ流れだが、GCCの場合、取得するパッケージ名はgcc-4.4となる。ligcの場合の手順ではdebian/rulesを編集したが、こちらはdebian/rulesではなくdebian/rules2を編集する。--with-tune=generic」という行で、genericをcore2に書き換えよう。ちなみに、GCCのコンパイルはとても時間がかかる。カーネルよりもかかる。PCを使っているときにビルドを開始すると後悔することになるので気をつけよう。その他のプログラムもついでにコンパイルちょっと話を脱線して、自前でdebパッケージをコンパイルしなおす方法についてもう少し触れておこう。自前でdebパッケージを構築する手順は、基本的にはlibcのところで紹介したものと同じである。libcやGCCではrulesファイルを編集したが、それはこれらのパッケージが特別だからであり、コンパイラオプションを指定するだけであれば、~/.config/dpkg/buildflags.confという設定ファイルに次のように書いておけば十分である。rulesファイルをいちいち編集する必要はない。-O3コンパイラオプションは好みに応じて変えると良いだろう。cmake以外はソースコードのビルドには関係はないけど、よく使うライブラリやソフトウェアを自前でコンパイルしておくとPC利用時の全体的な体感速度が向上する。寝る前にでもコンパイルを仕掛けておけば、翌日からPCライフが快適になるだろう。筆者は次のパッケージを自前でコンパイルしている。5.5では組み込み版のサーバーであるlibmysqldがデフォルトでは無効化されている。5.1まではデフォルトではlibmysqldも生成されてしまうのである。5.1を現役で利用されている人も多いことだろう。5.1でlibmysqldを生成しないようにするには、configureコマンド実行時に、--without-embedded-serverオプションを指定しよう。それだけで、4割程度時間の短縮になる。その他の注意点ソースコードのコンパイルは、とてもたくさんのCPUリソースを使う作業である。そのため、CPUをよく使うアプリケーションをコンパイル中に使うと、リソースの競合が起きてコンパイルもアプリケーションもスローダウンしてしまうことがある。よって、そのようなアプリケーションはコンパイル中は使わないか、できれば終了させておくと良いだろう。影響が大きいと感じるのはFirefoxだ。Firefoxを終了しておくと、コンパイルがよりスムーズに進むように感じる。極端なことを言えば、Xを終了してGUIのためにCPUリソースを使わないようにしておくとナイスだ。俺のようにCompizを使って3Dグリグリなデスクトップを使っていたりすると、消費するCPUリソースは馬鹿にならない。Xを終了させてRescueモードでログインすることで、コンパイルがさらに高速化することだろう。小技であるが、コンパイル時の標準出力を抑えるのも割と効く。makeの出力を/dev/nullにリダイレクトしても良いが、nohupコマンドなどを使ってファイルに落としておくだけでもかなり違う。-fで追いかけることも可能だ。さらなる高速化に向けて筆者のマシンは7200rpmのHDDを搭載しているのだが、SSDを搭載するともう少し記録が伸びるかも知れないと考えている。予算の都合上、それは今のところ見送っている。i7の拡張命令にも対応しており、将来的にはこのバージョンを使うことで、今よりも高速なバイナリを生成できるようになるかも知れない。まとめ今回思い知ったのは、フリーソフトウェアならびにオープンソースのありがたさである。ソースコードがなければ、そしてそのソースコードを自由に理由して良い権利がなければ、今回のようにシステムをコンパイルし直して高速化するなどということは出来ないだろう。「だったら全部自分でコンパイルすればいいんじゃないか?」と思うかも知れない。ソフトウェアのコンパイルにはまだまだ時間がかかる。大規模なソフトウェアでは数時間〜数日かかるような場合もあるだろう。従って、OSにインストールされている全てのソフトウェアを自分でコンパイルするのは、そのための手間と効用のバランスを考えると、現時点ではあまり現実的ではないというのが筆者の意見だ。従って、自分の目的に照らし合わせ、要となるソフトウェアまたはライブラリだけを自分でコンパイルするなどをして高速化を図るのが賢い選択だ。Linuxのように全てを自分でビルドするのがデフォルトだ!というOSが理想郷になるかも知れない。全てを自分でコンパイルする世界が到来するには、デバイスドライバやコーデックのソースコードが全て公開されている必要がある。そのためにも、筆者はフリーソフトウェア運動、オープンソース運動をもっと盛り上げる一員でありたいと思う。Okuno私は所謂ギークです。普段はMySQL関係の仕事をしています。今の時代、フリーソフトウェア(自由なソフトウェア)こそギークの歩く道だと信じています。コンピュータに手を染めてはや二十年。コンピュータ道はいくら進んでも終わりが見えない果てしない世界。コンピュータにはロマンがある。7.2見参!Webでも使える熱いヤツがやってきた。本ブログにおいて示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。