FreeBSD QandA 140

FreeBSD QandA

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 まで お知らせください。