小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

ふぁぼったーで使ってるPHPのプロファイリング用の関数

PHPでパフォーマンスチューニングをする時、特定のロジックの実行にどれくらい時間がかかっているのか知りたいことがよくある。よくあるというか、チューニングにプロファイリングは必須だ。世の中には高度なプロファイリングツールがあれこれあるみたいだけど、高機能すぎて僕にはよく分かんないです。
という訳で多分みなさんそれぞれ自前でパフォーマンスを計測してると思うんだけど、自分が普段ふぁぼったーのWeb開発で使っている、PHPの任意の部分の処理時間を計測するスニペットを公開してみます。やっつけですが。

使い方

getMS()関数は、前回getMS()が呼ばれた時刻からの経過時刻をミリ秒で返します。
すなわち、処理時間を計測したい部分の開始地点と終了地点でそれぞれgetMS()を呼び、終了地点での戻り値をprintするなりすれば任意の部分の処理時間を計測できます。

<?php
function getMS(){
    static $oldTime=0;
    list( $micro, $time ) = explode(' ',microtime());
    $newTime=$time+=$micro;
    $diffTime=$newTime-$oldTime;
    $oldTime=$newTime;
    return $diffTime;
}

getMS(); //計測開始

//
// 処理step 1
//

print ("step 1. ".getMS()."s<br>");  //step 1処理時間出力

//
// 処理step 2
//

print ("step 2. ".getMS()."s<br>");  //step 2処理時間出力
?>

結果

step 1. 0.0012s
step 2. 0.0003s

static変数を利用している関係上、入れ子構造で利用できないのが難点ですが、そんなときはgetMS2()を定義して(ry

あわせて読みたい

http://labs.unoh.net/2006/10/php_print_debug.htmlインスパイヤされて作った、デバッグモードでのみ表示されるprintみたいな関数も使ってます。みたまんま。DEBUG定数の状態で出力を制御します。

<?php
define('DEBUG',true);

function preprint($var){
    if(defined('DEBUG') && DEBUG){
        print $var;
    }
}
?>

さらに横着版

<?php
function preprint($var){
    if(true){
        print $var;
    }
}
?>