FreeBSD QandA 140
Q. プロファイラ・プロファイリングって何ですか? プロファイラの
使い方がわかりません。
A. プログラムの各関数が何回呼ばれ、実行時間がどれくらいかかったか
統計をとることをプロファイリングと言います。プロファイラは
その際に使用するツールです。
プログラムの高速化をしたい場合、手あたり次第に修正するの
ではなく、まずプロファイラで解析し、どこがボトルネックに
なっているか見極めましょう。
以下、C 言語でのプロファイリングの例を紹介します。
[ステップ 1]
プログラムをコンパイルするとき、-pg オプションを付けます。
% cc -pg hoge.c
もし
% cc -pg hoge.c
ld: -lc_p: no match
とエラーなった場合は、/usr/lib/libc_p.a がないと言われて
いますので、基本配布物である proflibs をインストールしま
しょう。
[ステップ 2]
コンパイルしたプログラムを実行します。
% ./a.out
カレントディレクトリに a.out.gmon というファイルが作ら
れているはずです (環境によっては gmon.out かもしれません)。
このファイルには、関数に入るときと出るときの時刻などの
情報が記録されています。
[ステップ 3]
統計結果を表示します。
% gprof a.out a.out.gmon
(略)
% cumulative self self total
time seconds seconds calls ms/call ms/call name
63.9 2.53 2.53 1 2534.18 2733.40 func1 [2]
5.0 3.32 0.20 1 199.22 199.22 func2 [7]
4.3 3.49 0.17 main [1]
3.4 3.63 0.14 664580 0.00 0.00 vfprintf [4]
(略)
func1 が全体の実行時間の 63.9% を占めているのに対し、
func2 は 5.0% であることがわかります。
func1 を 2倍高速化すれば、プログラム全体では 31% の実行
時間削減につながりますが、func2 を 2倍高速化した場合は
2.5% しか削減されません。
これにより、まずは func1 の高速化に着手すべき、という
結論が得られます。より詳細な情報は gprof(1) を参照して
ください。
gprof は、C 言語用のプロファイラです。他の言語でも、プロ
ファイラが用意されているはずです。例えば Perl なら DProf
パッケージを使います (p5-Devel-DProf として port/package
が用意されています)。
間違い・追加情報を見付けた場合は、
修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで
お知らせください。