PR

ソフトウエアそのものの実行を高速化することでもシステム・パフォーマンスを改善できる。しかしプログラムを書き換えて高速化を行うには,高度な知識が必要になり難しい。手間も必要になる。ここでは,コンパイル時に使用プロセッサ等に合わせた最適化処理を施す方法を紹介する。また,実行ファイルのサイズを縮小して,主に起動時間を高速にする手法も解説する。

コンパイラによる最適化でプログラムを高速化

 ハードウエアを変更せずにソフトウエアの実行速度を大きく改善するには,プログラムを書き換える方法がある。プログラムで採用するアルゴリズムをより高速なものにするなどの改良が効果的であるが,アルゴリズムやプログラミング技法に精通していなければこうした書き換えは難しいことが多い。

 そこで,プログラムを書き換えずに手軽に高速化を実現する方法として,コンパイラの最適化機能を紹介する。

 プログラムが,より高速に動作するように,あるいはよりそのサイズが小さくするようにオブジェクト・ファイルを生成することを「最適化」という。プログラム・サイズの縮小よりも実行速度の高速化が求められるケースが多いため,特に指定せずに最適化といった場合は実行速度を高めるものを指す。

 コンパイラによる最適化はプログラムのコンパイル時に行われる。そのためプログラムをソース・コードからコンパイルし直す必要がある。ソース・コードが公開されていないプログラムでは利用できない。

 Linuxで標準的に利用されているCコンパイラ「GCC」(GNU Compiler Collection)では,コンパイル時にさまざまな最適化オプションを指定できる。しかし,それらの多くは,プログラミングやプロセッサ・アーキテクチャに精通していなければ適切に指定することが困難である。不用意に指定すれば,かえって実行速度が低下したり,最悪の場合プログラムが動作しなくなってしまう。

 簡単に利用できるオプションとしては,最適化の度合いを指定する「-O」オプションと,プロセッサに依存した最適化を行う「-march」,「-mcpu」オプションがある。

最適化レベルの指定

 -Oオプションを利用すると,同時に指定する0~3(実際のオプションは,-O0~-O3)までの数値によって,GCCの最適化レベルを指定できる。数値により表1のような最適化が行われる。数字が大きくなるほど,プログラムの高速動作が期待できるが,プログラムによっては誤動作する可能性も高くなる。通常は,-O2までの指定で問題が生じることはほとんどない。実際,ソース・コードで配布されるプログラムの多くは,コンパイル時に自動的に-O2を指定している。

表1●-OオプションによるGCCの最適化レベル指定
指定する数値が大きくなると,より進んだ最適化を行うようになる。
[画像のクリックで拡大表示]
表1●-OオプションによるGCCの最適化レベル指定

 なお,Pentium以降のx86互換プロセッサに特化したコンパイラ「pgcc」(http://
www.goof.com/pcg/
)のように,-O7まで指定可能なものもあり,よく使われている。

 GCCの最適化オプションは一般に,Makefile中のCFLAGSあるいはCXXFLAGS(C++で記述されたプログラムの場合)行で指定する。 OPTIMIZEなどの変数を利用することもある。これらの変数に「-O2」などと使いたい最適化オプションを指定する。