トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/21

ページの作成や編集にはユーザ登録が必要です。

プロセスのCPU消費時間を表示する

  • 投稿者: typer
  • カテゴリ: 新規
  • 優先度: 低
  • 状態: 提案
  • 日時: 2003年07月06日 14時10分30秒

 内容

実行効率についての話題がいくつか出てきているようですね。そんなわけで参考になればと作ってみました。

使い方

{{times [none|real|user|system|cuser|csystem]}}
  • 出力されるのはtimes関数の値です。
  • 引数がない場合は全ての値を整形して出力します。
  • 同一プロセス(ページ)で二度目以降は前回との差分です。
  • 引数を指定した場合はその数値のみを記録・表示します。
  • noneの場合は表示はせず、(全項目の)記録だけ行います。
  • realは60の剰余を表示します。

とりあえずMenuの最後に

times: {{times user}}

と書いておけば負荷の高いページをみつける参考になるかと。

動作について

このプラグインはPOSIX::timesを利用します。

real
実際の秒数
user
プロセスが実際に使用したCPU時間
system
システムが使用したCPU時間
cuser
子プロセスが実際に使用したCPU時間
csystem
子プロセス実行中にシステムが使用したCPU時間
詳しくはman time(2)あたりを...(^^;

さて、POSIXは対応状況にばらつきがあるようですので、一応evalしてあります。POSIX::timesの呼び出しに失敗した場合は標準のtimesを使用しますが、realについてはtime関数となるため精度が1秒となり、実用的ではなくなります。この時、出力には<!-- fail POSIX::times -->と付加します。

また、mod_perlやWin環境でどうなるかはわかりません。POSIX非対応や上記環境の違いに関してコメント下さい。

 コメント

  • 3.5系統に移植してみました。times-3.5.0.lzh(464) - BJM(と) (2003年08月30日 04時47分09秒)
  • 3.5.5 でしか確認してませんが、POSIX::times 呼び出し失敗時のコメントがHTMLエンコードされてそのまま出てしまう点、引数を個別に指定するとフォーマットが指定されていないので桁数がすごいことになることがある点、個別指定でrealが計算されてないそのままの値を出力する点、の3つの問題を発見できたので直してみました。Times.pm(502) をそのまま添付しました。 - gyo (2004年06月17日 13時43分38秒)
--- Times.pm.dist   2003-08-30 04:41:38.000000000 +0900
+++ Times.pm    2004-06-17 13:31:56.000000000 +0900
@@ -51,14 +51,14 @@
     # POSIX::timesに失敗していたらtimeとtimesを使う。
     unless(@times){
    @times = (time(),times());
-   $buff .= "<!-- fail POSIX::times -->";
+#  $buff .= "<!-- fail POSIX::times -->";
     }
 
-    if($mode eq ""){
    my @diff = map {$times[$_] - $self->{times}[$_]} (0..4);
    if($diff[0] >= 60){
        $diff[0] -= int($diff[0]/60)*60;
    }
+    if($mode eq ""){
    $self->{times} = \@times;
    $buff .= sprintf "%.2f real, %.2f user, %.2f system,".
            " %.2f cuser, %.2f csystem",@diff;
@@ -66,9 +66,8 @@
    $self->{times} = \@times;
     } elsif(exists $mode{$mode}){
    $mode = $mode{$mode};
-   my $diff = $times[$mode] - $self->{times}[$mode];
    $self->{times}[$mode] = $times[$mode];
-   $buff .= "$diff";
+   $buff .= sprintf "%.2f", $diff[$mode];
     } else {
       return &Util::inline_error("不正なパラメータです。","WIKI");
     }
  • 作者さんが懸念されてる動作環境のうち、 Windows ではちゃんと動作しているように見えます。mod_perl 環境では意図した時間にならず、累積時間になってしまいます。直そうとしたけど、よくわからないので諦めました。mod_perl では wiki.cgi にそれ用の処理を埋め込まないと処理時間を知る術がないんじゃないでしょーか。 - gyo (2004年06月17日 13時51分08秒)
お名前: コメント:
Times.pm times-3.5.0.lzh times.tar.gz

最終更新時間:2006年08月02日 00時57分21秒