shimabox / smbbenchmark
简单基准测试
v1.3.3
2020-12-20 02:52 UTC
Requires
- php: ^5.4|^7.0
- shimabox/smbarrayto: ^1.0
Requires (Dev)
- codeclimate/php-test-reporter: dev-master
- phpunit/phpunit: ^4.8 || ~5.0
README
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(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