名前¶
Devel::Profile - なぜ自分のプログラムがとても遅いのか教えてくれます。
概要¶
perl -d:Profile program.pl
less prof.out
説明¶
Devel::Profileパッケージは、Perl用のコードプロファイラです。 これは、Perlスクリプトおよび、そのスクリプトのサブルーチンの実行時間に関する情報を集めます。 この情報から、どのサブルーチンが最も多くの時間を使っているか、そして、どのサブルーチンが 最も頻繁に呼ばれているか調査するのに使用することができます。
Perlスクリプトのプロファイルを行うには、-d スイッチを使用してperlインタプリタを実行します。 プロファイラは、デバッグ用のフックを使っています。 test.plのプロファイルを行う場合以下のようなコマンドになります。
perl -d:Profile test.pl
スクリプトが終了時(または、実行中の一定周期的に ENVIRONMENT章を参照)、 プロファイラはprof.outと言う名前のファイルに、プロファイル情報を出力します。 出力されたファイルはテキストファイルで、そのまま読むことが出来ます。別のツール などを使って読む必要はありません。
備考:統計はサブルーチン単位に行われます。コード単位ではありません。
環境変数¶
PERL_PROFILE_SAVETIME
-
実行中に何秒ごとにプロファイルを出力するかを指定します。 0を指定すると終了時のみに出力します。 デフォルトは二分毎です。
PERL_PROFILE_FILENAME
-
プロファイルを出力するファイル名を指定します。 デフォルトはカレントディレクトリの prof.out です。
PERL_PROFILE_DONT_OTHER
-
場合によっては、サブルーチン以外で実行されるコードの時間(例えばmainスコープの裸のコード) を集計したくないかもしれません。 デフォルトでは、この部分は '<other>' という名前で集計されますが この変数に何かの値をセットすると、集計を行いません。 これは、プログラムの実行時間として集計される時間がその分少なくなる為、(訳注:実行時間の比率 などに)影響を与えることに注意してください。
出力形式¶
出力例:
time elapsed (wall): 86.8212
time running program: 65.7657 (75.75%)
time profiling (est.): 21.0556 (24.25%)
number of calls: 647248
%Time Sec. #calls sec/call F name
31.74 20.8770 2306 0.009053 Configable::init_from_config
20.09 13.2116 144638 0.000091 Configable::init_field_from_config
17.49 11.5043 297997 0.000039 Configable::has_attr
8.22 5.4028 312 0.017317 MonEl::recycle
7.54 4.9570 64239 0.000077 Configable::inherit
5.02 3.3042 101289 0.000033 MonEl::unique
[...]
簡単な概要の後につづいて、サブルーチン毎に1行のデータがあります。
- time elapsed (wall)
-
トータル実行時間(プロファイラとプログラム)
- time running program
-
プログラム実行時間とトータルとの比率
- time profiling
-
プロファイラ実行時間とトータルとの比率
- number of calls
-
プログラム内でサブルーチンがコールされた総数
サブルーチン毎の行データは以下です。
- name
-
サブルーチンの名前
- %Time
-
サブルーチン実行時間の全体との比率
- Sec.
-
サブルーチン実行時間の合計
- #calls
-
サブルーチン呼出回数
- sec/call
-
サブルーチン一回あたりの実行時間平均
- F
-
フラグ
*
-
原文まま pseudo-function to account for otherwise unacounted for time. (訳注:意味理解できなかったのですが、<other>等のサブルーチンでないと 表現しているのでは?と思います。)
?
-
このサブルーチンを呼び出したあと、returnせず終了しました。 (例えば、die や exit で終了するなど。) (訳注:sec/callの)集計に若干の誤差が出ている場合があります。
x
-
このサブルーチンを呼び出したあと例外発生で終了しました。 (訳注:sec/callの)集計に若干の誤差が出ている場合があります。
実行時間の長いプログラム¶
このモジュールは長時間実行される(デーモン)プログラムでもプロファイリング 出来るように書かれています。通常はこのようなプログラムは終わることが無く プロファイルの出力が終了時に限られてしまうのは面白くない選択です。 このモジュールは定期的に$PERL_PROFILE_SAVETIMEに基づく間隔でプロファイ ル出力が可能ですし、DB::save()を呼び出して、コードの任意の位置でプロファ イル出力させることも可能です。ですからプログラムを実行していても、プロ ファイルを参照することが出来ます。
上記の様なプログラムで、非常に時間がかかる初期化処理(設定ファイルの 読み込みやデータ構造の初期化など)があるのなら、初期化処理と処理本体を 分けてプロファイリングしたいと思うでしょう。 その場合は、一旦プロファイルを保存した後に、DB::reset()を呼び出して、 それまでの統計をリセットすることが出来ます。リセットを行うと、その時点 からの統計がプロファイルに出力されます。
デフォルトではリセットを行う為のシグナルをSIGUSR2で受け取るようになって います。シグナルが安全に取り扱える、perl5.8.0以降を使用すると、プロファ イル出力の為のシグナルのコントロールが安全に行えるでしょう。
バグ¶
既知のバグはありません。
参考資料¶
イエローストーン国立公園
作者¶
Jeff Weisberg - http://www.tcp4me.com/