どうもとある処理に時間がかかってるような気がする。そんなときはきちんと時間を計測しよう。もちろんこの方のようにストップウォッチ片手に計測してもいいが、いやしくもプログラマのはしくれならプログラムで解決しよう。

…とか書くのも恥ずかしくなるぐらい簡単なコードで恐縮である。このコードに関してはコピペして使っていただいてもまったく構わない。コピペするより書いたほうが早いくらいだし。

見かけどおりPHP4でも動くはず。PHP5だとmicrotime()が引数を取る(trueを指定するとfloat値が返ってくるので単純に引き算すればいい)のでもっと簡単なコードになる。

getNowメソッドがちょっと冗長なのは、Lap機能も作ろうとしてやめた形跡だった記憶がある。

【StopWatch.php】

<?php
class StopWatch
{
    var $start_sec ;
    var $start_msec ;
    var $stop_sec ;
    var $stop_msec ;
    function start()
    {
        $this->getNow("start") ;
    }
    function stop()
    {
        $this->getNow("stop") ;
    }
    function getNow($kind)
    {
        $sec"{$kind}_sec" ;
        $msec = "{$kind}_msec" ;
        list($this->$msec, $this->$sec) = explode(" ", microtime()) ;
    }
    function dispTime()
    {
        echo "start:" . ($this->start_sec + $this->start_msec) . "\n" ;
        echo "stop :" . ($this->stop_sec  + $this->stop_msec)  . "\n" ;
        $sec  = $this->stop_sec - $this->start_sec ;
        if ($this->start_msec > $this->stop_msec)
        {
            $msec = ($this->stop_msec + 1.0) - $this->start_msec ;
            $sec -= 1 ;
        }
        else
        {
            $msec = $this->stop_msec - $this->start_msec ;
        }
        echo "time :" . ($sec + $msec) . "\n" ;
    }
}
?>

【example】

<?php
require_once 'StopWatch.php' ;
$sw = new StopWatch() ;
$sw->start() ;
// 計測対象の処理
while (true)
{
    // do something.
}
$sw->stop() ;
$sq->dispTime() ;
?>