Devel::DProf - シンプルなプロファイラ
プログラムを実行しても必要なパフォーマンスが得られないことがあります。どの部分がボトルネックになっているのかを調べるのは簡単なことではありません。プロファイラと呼ばれるツールを利用すればプログラムの中のどの処理で時間がかかっているかを調べることができます。(現在であれば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++; } }
while文を使って数値をインクリメントしています。