ハッカーたるもの無駄な努力をするべきではありません。天より与えられたハッキングの才能を浪費することは許されないのです*。では、努力を無駄にしないためにはどうしたら良いでしょうか。
そのためには「パレートの法則」を理解しておく必要があります。パレートの法則とは「80:20則」とも呼ばれるもので、全体の8割の数値は全体を構成する2割の要素が生み出しているという法則です。19世紀後半のイタリアの経済学者ヴィルフレド・パレート(Vilfredo Federico Damaso Pareto)が発見したことから、このような名前がついています。
パレートの法則から分かるのは、要するに努力が報われる2割の領域と報われない8割の領域*があり、報われない領域で幾ら努力しても無駄にしかならないということです。だから最適化を始める前に、その作業が無駄になるかならないかを見極める必要があります。
作業が無駄になるかどうか見極めるツールをプロファイラと呼びます。Linuxで最も有名なプロファイラはgprofでしょう。
gprofを使うには、コンパイル時にccのコマンドラインオプションとして「-pg」を追加します。このオプション付きでコンパイルされたプログラムには、関数の実行状態を測定するルーチンがリンクされます。プログラムを実行すると、カレントディレクトリにgmon.outファイルが生成されます。プロファイル結果を見るには、そのディレクトリで、
gprof <プログラム名>
を実行します。これによって、
などの情報を含む長いリストが出力されます。それを調べることで、「どの関数で最も時間がかかっているか」とか「どの関数が無駄に関数を呼び出しているか」などを確かめられます。この情報を参考にすることで、より効果的な最適化ができるでしょう。
実効速度を見るgprof以外にも、メモリ消費量を調べるメモリプロファイラなど、測定するプログラムはたくさんあります。
正しく測定して効果的な最適化を行うことは、ハッカーの測定狂的性質とスピード狂的性質の両方を一度に満足させることができます。一粒で二度おいしい最適化、あなたも試してみませんか?
念のため注釈をつけておくが、当然冗談である。だが、ハッカーが無駄な努力を嫌う傾向があるのは事実。
パレートの法則における80:20の関係は経験則であり、実際にはもっと極端な場合もしばしばある。少なくともプログラミングに関しては90:10とか99:1とかは決して珍しくない。
本記事は、オープンソースマガジン2005年12月号「まつもとゆきひろのハッカーズライフ」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.