Devel::DProf - シンプルなプロファイラ



  1. Perl




  2. モジュール



  3. here

 プログラムを実行しても必要なパフォーマンスが得られないことがあります。どの部分がボトルネックになっているのかを調べるのは簡単なことではありません。プロファイラと呼ばれるツールを利用すればプログラムの中のどの処理で時間がかかっているかを調べることができます。(現在であればDevel::NYTProfを利用するのがよいでしょう。)

 標準モジュールにシンプルなプロファイラであるDevel::DProfモジュールがあるのでこれを利用することができます。

 プロファイルを作成するのは簡単です。次のコマンドを実行するとカレントディレクトリに「tmon.out」というプロファイルを情報を出力したファイルが作成されます。

# プロファイル情報の作成
perl -d:DProf target.pl

 「tmon.out」を見やすいフォーマットで表示するにはdprofppコマンドを実行します。

# プロファイルを見やすいフォーマットで表示
dprofpp

 すると次のような見やすいフォーマットで出力されます。

# プロファイル
Total Elapsed Time = 1.171916 Seconds
  User+System Time = 1.171916 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 78.6   0.922  0.922      2   0.4610 0.4610  main::func2
 18.6   0.218  0.218      1   0.2180 0.2180  main::func1
 1.37   0.016  0.016      5   0.0032 0.0032  main::BEGIN
 0.00       - -0.000      1        -      -  strict::bits
 0.00       - -0.000      2        -      -  strict::import
 0.00       - -0.000      2        -      -  warnings::import

 各項目の意味は次のようになっています。時間がかかった順に上位から表示されます。

%Time サブルーチンの実行時間の全体に対する割合
ExclSec サブルーチンの実行時間(サブルーチンの呼び出しを含まない)
CumulS サブルーチンの実行時間(サブルーチンの呼び出しを含む)
#Calls ルーチン呼び出し回数
sec/call 1回あたりのサブルーチンの実行時間(サブルーチンの呼び出しを含まない)
Csec/c 1回あたりのサブルーチンの実行時間(サブルーチンの呼び出しを含む)
Name サブルーチン名

 上記の結果はスクリプトを実行した場合の私の環境での結果です。

use strict;
use warnings;

func1();
func2();
func2();

sub func1 {
  my $i = 0;
  while ($i < 1000000) {
    $i++;
  }
}

sub func2 {
  my $i = 0;
  while ($i < 2000000) {
    $i++;
  }
}