tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

Benchmark使ってみるテスト

ちょっと計測したい処理があったがBenchmarkモジュール使ったことがなかったのでそのテスト
ついでに任意のところにBenchmarkモジュール持ってくるところからw

Benchmarkモジュール持ってくる

http://pear.php.net/からPackages>Benchmarking>Benchmark>Downloadの順にたどって1.2.9のリンク先URLから取得

# pwd
/home/hoge/phptest/lib
# wget 'http://download.pear.php.net/package/Benchmark-1.2.9.tgz'
# tar zxvf Benchmark-1.2.9.tgz
# ls -al
drwxr-xr-x 4 hoge cam   4096  4月 12 16:51 Benchmark-1.2.9
-rw-r--r-- 1 hoge cam   8696 12月 11  2011 Benchmark-1.2.9.tgz
#ls -1R Benchmark-1.2.9
Benchmark-1.2.9:
Benchmark
LICENSE
README
doc

Benchmark-1.2.9/Benchmark:
Iterate.php
Profiler.php
Timer.php

Benchmark-1.2.9/doc:
timer_example.php

使ってみる

もってきたやつをrequireして使ってみる

/home/hoge/phptest/benchmark_test.php

<?php 
# require
require_once("lib/Benchmark-1.2.9/Benchmark/Timer.php");

$timer = new Benchmark_Timer;
$timer->start();
$timer->setMarker('mark_A');

$loop_num = 1000;
foreach ( range(1,$loop_num) as $num ){
	# なんかの処理
}
$timer->setMarker('mark_B');
$timer->setMarker('end');
$timer->stop();
$timer->display();
?>
結果
# php benchmark_test.php
----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1365764385.30119300   -                0.00%
----------------------------------------------------
mark_A  1365764385.30125600   6.2942504882812E-5  15.28%
----------------------------------------------------
mark_B  1365764385.30154200   0.00028610229492188  69.44%
----------------------------------------------------
end     1365764385.30157100   2.8848648071289E-5   7.00%
----------------------------------------------------
Stop    1365764385.30160500   3.4093856811523E-5   8.28%
----------------------------------------------------
total   -                     0.0004119873046875100.00%
----------------------------------------------------

もうちょっとためし

結果の取得(表示)の仕方がいくつかあるらしいのでそれもテスト
↑のソースの$timer->display();の部分を変えるだけ

$timer->display($showTotal, $format)

関数名の通りですね。
$showTotal…結果(列)にelapsedとperctを追加するやつ。デフォルトfalse
$format…表示のフォーマット。'auto','plain','html'があって、'auto'の場合は$_SERVER['SERVER_PROTOCOL']を見て'plain'か'html'を自動判別する。今はバッチで叩いてるので当然'plain'が入る

$timer->timeElapsed($start, $end)

任意の間隔の経過時間を取得
$startと$endは、それぞれ'start'、'stop'がデフォルトで設定されているので指定しなければそれ。

<?php 
.......
$timer->stop();

$elapsed1 = $timer->timeElapsed();
var_dump($elapsed1);

$elapsed2 = $timer->timeElapsed('mark_A', 'end');
var_dump($elapsed2);

$elapsed3 = $timer->timeElapsed('mark_A', 'END');
var_dump($elapsed3);

$elapsed4 = $timer->timeElapsed('tekitou', 'nanka');
var_dump($elapsed4);
?>
# php benchmark_test.php
float(0.00041294097900391)
float(0.00031900405883789)
float(-1365994925.5735)
int(0)

$elapsed3と$elapsed4を見てわかるとおり、指定していないMarkerは0として扱われる的な

$timer->timeElapsed($start, $end)

配列で取得

<?php 
.......
$timer->stop();

$prof = $timer->getProfiling();
print(print_r($prof,1));
print "\n";
?>
# php benchmark_test.php
Array
(
    [0] => Array
        (
            [name] => Start
            [time] => 1366082135.83870300
            [diff] => -
            [total] => -
        )

    [1] => Array
        (
            [name] => mark_A
            [time] => 1366082135.83876000
            [diff] => 5.6982040405273E-5
            [total] => 5.6982040405273E-5
        )

    [2] => Array
        (
            [name] => mark_B
            [time] => 1366082135.83906000
            [diff] => 0.00030016899108887
            [total] => 0.00035715103149414
        )

    [3] => Array
        (
            [name] => end
            [time] => 1366082135.83909400
            [diff] => 3.3855438232422E-5
            [total] => 0.00039100646972656
        )

    [4] => Array
        (
            [name] => Stop
            [time] => 1366082135.83913300
            [diff] => 3.9100646972656E-5
            [total] => 0.00043010711669922
        )

)