shimabox/smbbenchmark

简单基准测试

v1.3.3 2020-12-20 02:52 UTC

This package is auto-updated.

Last update: 2024-09-20 11:13:16 UTC


README

License Build Status Coverage Status Maintainability Latest Stable Version Latest Unstable Version

PHP的简单基准测试

关于

  • PHP的简易基准测试
  • 可以在匿名函数内编写测试处理,也可以测试对象的函数
  • 可以输出测试结果或获取测试结果
  • 支持PHP5.4及以上版本
    • 另外,也有支持PHP5.3的版本

安装

composer require shimabox/smbbenchmark

用法

// vendor/autoload.php を読み込みます
require_once '/your/path/to/vendor/autoload.php';

example.1 通常使用

// インスタンス生成
$bm = SMB\Benchmark::getInstance();

// スタート
$bm->start('bench1'); // 引数にマーキング用の値を渡す

// 計測処理
for ($i = 0; $i < 100; $i++) {
    new stdClass();
}

// 終了
$bm->end('bench1');

// 出力
// 小数点6桁(マイクロ秒単位)まで出力(デフォルト)
$bm->echoResult('bench1'); // => benchmark => bench1 : 0.・・・・・・秒

example.2 在匿名函数内编写要测试的处理(使用measure()函数)

// インスタンス生成
$bm = SMB\Benchmark::getInstance();

// 計測したい処理をmeasure()に書く
// measure()はcallableを引数に取ります
$d = 4; // ローカル変数
$bm->measure(
    // 第1引数に無名関数も渡せてその中に処理も書ける
    function($a, $b, $c) use ($d) {
        echo $a . $b . $c . $d . PHP_EOL;
    },
    array(1, 2, 3), // 関数に対して引数を配列で渡せる
    'bench2' // start(),end()を使わなくてもマークできる
);

$bm->echoResult('bench2');

// 関数の引数なしでマークありの場合は空の配列を第2引数に渡す
$bm->measure(
    function() {
        for ($i = 0; $i < 10000; $i++) {
            new stdClass();
        }
    },
    array(),
    'bench3'
);

// オブジェクトの関数も渡せる
require_once 'Hoge.php'; // サンプル用

$obj = new Hoge();

$bm->start('bench4');
$bm->measure(array($obj, 'callbackMethod'));
$bm->end('bench4');
$bm->echoResult('bench4');

// 引数は配列で渡す
$bm->start('bench5');
$bm->measure(array($obj, 'callbackMethod'), array(1, 2, 3));
$bm->end('bench5');
$bm->echoResult('bench5');

// 静的メソッドも測定可能
$bm->start('bench6');
$bm->measure(array('Hoge', 'staticCallbackMethod'));
$bm->end('bench6');
$bm->echoResult('bench6');

example.3 可链式调用

$bm = SMB\Benchmark::getInstance()
        ->start('bench7')
        ->measure(function() {
            usleep(1000000); // 1秒
        })
        ->end('bench7')
        ->measure(function() {
            usleep(500000); // 0.5秒
        }, array(), 'bench8')
        ;

$bm->echoResult('bench7');
$bm->echoResult('bench8');

// 入れ子も可能
$bm = SMB\Benchmark::getInstance()
        ->start('bench9')
        ->start('bench10')
        ->measure(function() {
            usleep(100000); // 0.1秒
        })
        ->end('bench10')
        ->measure(function() {
            usleep(50000); // 0.05秒
        }, array(), 'bench11')
        ->end('bench9')
        ;

$bm->echoResult('bench9');  // => benchmark => bench9 : 0.15・・・・秒
$bm->echoResult('bench10'); // => benchmark => bench10 : 0.1・・・・・秒
$bm->echoResult('bench11'); // => benchmark => bench10 : 0.05・・・・秒

example.4 输出所有测试结果

$bm->echoResultAll(); // => bench1〜bench11までの計測結果が出力される

example.5 初始化

  • 如上所述,它是单例模式,因此有初始化方法
// マーキングのクリア
$bm->clearMark('bench11');  // bench11をクリア
$bm->echoResult('bench11'); // => 出力なし
$bm->echoResultAll();       // => bench1〜bench10までの計測結果が出力される

// すべてのマーキングをクリア
$bm->clearMarkAll();
$bm->echoResultAll(); // => 出力なし

// インスタンスのクリア
SMB\Benchmark::clear();

example.6 仅返回基准测试结果

// 単独の出力
$bm = SMB\Benchmark::getInstance()
        ->measure(function() {
            usleep(50000); // 0.05秒
        }, array(), 'bench12')
        ->measure(function() {
            usleep(5000); // 0.005秒
        }, array(), 'bench13')
        ;

echo $bm->result('bench12') . PHP_EOL; // => 0.05・・・・
echo $bm->result('bench13') . PHP_EOL; // => 0.005・・・

// 計測結果すべての出力
$bm->clearMarkAll();
$bm = SMB\Benchmark::getInstance()
        ->start('bench14')
        ->start('bench15')
        ->measure(function() {
            usleep(100000); // 0.1秒
        })
        ->end('bench15')
        ->measure(function() {
            usleep(50000); // 0.05秒
        }, array(), 'bench16')
        ->end('bench14')
        ;

var_dump($bm->resultAll()); // => array('bench14'=>'0.15・・・・', 'bench15'=>'0.1・・・・・', 'bench16'=>'0.05・・・・')

$bm->clearMarkAll();
var_dump($bm->resultAll()); // => array()

example.7 指定次数重复执行测试目标处理(结果为平均值)

// SMB\Benchmark::getInstance()->measure();
// 第4引数に繰り返し行う回数を指定します。
$bm = SMB\Benchmark::getInstance()
        ->measure(
            function() {
                usleep(2000); // 0.002秒
            },
            array(),
            'bench17',
            100 // 100回繰り返す
        )
        ;

// 結果は100回行なった結果の平均値
echo $bm->echoResult('bench17') . PHP_EOL; // benchmark => bench17 : 0.002・・・秒

其他

使用BCMath(任意精度数学函数)

为了处理浮点数,使用了BCMath(任意精度数学函数)。

BCMath

即使没有BCMath也可以使用,但测量结果的精度会降低。

BCMath(php-bcmath)的安装方法

示例。请根据您的环境进行修改。

环境

$ cat /etc/redhat-release # CentOS release 6.8 (Final)

安装

# enablerepoは適宜修正
$ sudo yum install php-bcmath --enablerepo=remi,remi-php56

以下可以检查是否已安装

$ yum list installed php-bcmath
インストール済みパッケージ
php-bcmath.x86_64    5.6.29-1.el6.remi    @remi-php56

安装后,请重新加载apache

$ sudo service httpd reload

更改输出结果的小数点

输出结果默认显示到小数点后6位(0.000000秒,以微秒为单位),但这是可以修改的。 ※如果小数点位数较少,则处理速度过快时可能会被四舍五入为0秒

要修改,请使用 setScale()

// インスタンス生成
$bm = SMB\Benchmark::getInstance();

// 小数点4桁に変更
$bm->setScale(4);

$bm->start('other1');
for ($i = 0; $i < 1; $i++) {}
$bm->end('other1');

// 出力

// 小数点4桁まで出力
$bm->echoResult('other1'); // => benchmark => other1 : 0.XXXX秒 (処理が早過ぎると、ほぼ0.0000秒になる)


// もちろんチェーン可能
SMB\Benchmark::getInstance()
    ->setScale(4)
    ->measure(function() {}, array(), 'other2')
    ->echoResult('other2')
    ;

// 1より小さい値をセットされたらデフォルトの6桁でセットし直します。
$bm->setScale(0); // => scaleは6になる

更改输出结果的格式

echoResult(),echoResultAll() 的输出格式默认为 benchmark => {$mark} : {$benchmark}秒,但可以通过修改 \SMB\Benchmark\Formatter::forEcho() 或创建并设置实现了 \SMB\Benchmark\IFormatter 接口的类来更改到喜欢的格式。

创建这样的格式化器后,

<?php

class SampleFormatter implements SMB\Benchmark\IFormatter
{
	public function forEcho($mark, $benchmark)
	{
		return '<pre>'.$mark.'の計測時間は'.$benchmark.'秒でした</pre>'.PHP_EOL;
	}
}

可以这样使用。

require_once 'SampleFormatter.php'; // サンプル用

$formatter = new SampleFormatter();
SMB\Benchmark::getInstance()
    ->setFormatter($formatter)
    ->measure(function() {}, array(), 'bench19')
    ->echoResult('other3')
    ; // => other3の計測時間は0.XXXXXX秒でした

PHP5.3兼容版

此库的目标是PHP5.4及以上版本,但如果希望在PHP5.3中运行,请使用 SMB\Benchmark\PHP53\Benchmark

区别是

  • Benchmark::measure() 第1个参数的类型提示(callable)已被删除
  • 在匿名函数内使用 $this
    • Benchmark::resultAll(), Benchmark::echoResultAll() 中将 $this 保存
    • Benchmark::existsMark(), Benchmark::calc(), Benchmark::getFormatter() 的访问修饰符为 public

(实际上真的想用[]来处理数组)

测试

  • 已确认PHPUnit版本为4.8.31
vendor/bin/phpunit

注意

请将此库输出的测量结果仅作为参考。

许可

  • MIT License