Posted at

PHPで実行時間を同時に何箇所も計測する

PHPのプログラムのどこが遅いのかデバッグするときに何箇所にも計測地点を設定したいことがあります。

PEARのBenchmarkというライブラリがあるようなのでそれを使ってもいいのですが、クラスや関数を跨いでいたりすると面倒なのでグローバルスコープの変数を使って、以下の様なパフォーマンス計測の関数を作ってみました。


コード

function setBenchMarker() {

if ( !is_array($GLOBALS["benchmark"]) ) {
$GLOBALS["benchmark"] = array();
}
$trace = debug_backtrace();
$line = $trace[0]["line"];
$file = $trace[0]["file"];
array_push($GLOBALS["benchmark"], array("point"=>$file.":".$line, "time"=>microtime(true)));
}
function getBenchMarkResult($delim="\n") {
$lasttime = 0;
$lastpoint = 0;
$retbuf = "";
$records = $GLOBALS["benchmark"];
foreach ( $records as $record ) {
$point = $record["point"];
$time = $record["time"];
if ( $lasttime != 0 ) {
$retbuf .= "[".$lastpoint."]--[".$point."] = ".sprintf('%0.5f', $time-$lasttime).$delim;
}
$lastpoint = $point;
$lasttime = $time;
}
return $retbuf;
}


使い方

処理の計測を始めたいところと、終わりに

setBenchMarker();

を書く。(複数の箇所に書いてもOK)

getBenchMarkResult();

で、計測結果を文字列として取得する。

echo や error_log などで結果を出力する。

class Hoge {

public function __construct( ){}
public function moge() {
setBenchMarker();
}
}
function foo() {
setBenchMarker();
}

setBenchMarker();
foo();
$hoge = new Hoge();
$hoge->moge();
setBenchMarker();

$bench = getBenchMarkResult();
echo $bench;


結果

[開始のプログラムのパス:行数]--[終了のプログラムのパス:行数] = 実行時間

$ ./test.php

[/home/ec2-user/test.php:4]--[/home/ec2-user/test.php:21] = 0.087116003
[/home/ec2-user/test.php:21]--[/home/ec2-user/test.php:30] = 0.010456085
[/home/ec2-user/test.php:30]--[/home/ec2-user/test.php:9] = 0.000001907