{"id":22328148,"url":"https://github.com/shimabox/smbbenchmark","last_synced_at":"2025-10-31T10:44:42.809Z","repository":{"id":55590265,"uuid":"37801217","full_name":"shimabox/SMBBenchmark","owner":"shimabox","description":"Simple benchmark of php","archived":false,"fork":false,"pushed_at":"2020-12-20T02:55:36.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-31T08:14:23.907Z","etag":null,"topics":["bcmath","benchmark"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shimabox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-21T07:52:31.000Z","updated_at":"2020-12-20T02:52:49.000Z","dependencies_parsed_at":"2022-08-15T03:50:35.210Z","dependency_job_id":null,"html_url":"https://github.com/shimabox/SMBBenchmark","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shimabox%2FSMBBenchmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shimabox%2FSMBBenchmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shimabox%2FSMBBenchmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shimabox%2FSMBBenchmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shimabox","download_url":"https://codeload.github.com/shimabox/SMBBenchmark/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245600160,"owners_count":20642252,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bcmath","benchmark"],"created_at":"2024-12-04T03:11:43.564Z","updated_at":"2025-10-31T10:44:37.763Z","avatar_url":"https://github.com/shimabox.png","language":"PHP","readme":"# SMBBenchmark\n\n[![License](https://poser.pugx.org/shimabox/smbbenchmark/license)](https://packagist.org/packages/shimabox/smbbenchmark)\n[![Build Status](https://travis-ci.org/shimabox/SMBBenchmark.svg?branch=master)](https://travis-ci.org/shimabox/SMBBenchmark)\n[![Coverage Status](https://coveralls.io/repos/github/shimabox/SMBBenchmark/badge.svg?branch=master)](https://coveralls.io/github/shimabox/SMBBenchmark?branch=master)\n[![Maintainability](https://api.codeclimate.com/v1/badges/f7afbb17888f2fd2cc01/maintainability)](https://codeclimate.com/github/shimabox/SMBBenchmark/maintainability)\n[![Latest Stable Version](https://poser.pugx.org/shimabox/smbbenchmark/v/stable)](https://packagist.org/packages/shimabox/smbbenchmark)\n[![Latest Unstable Version](https://poser.pugx.org/shimabox/smbbenchmark/v/unstable)](https://packagist.org/packages/shimabox/smbbenchmark)\n\nSimple benchmark of php\n\n## About\n\n* PHPの簡易ベンチマークです\n* 無名関数内に計測処理を書いたり、オブジェクトの関数も計測出来ます\n* 計測結果のecho、または、計測結果の取得が出来ます\n* PHP5.4以上で動きます\n  * 後述しますが、PHP5.3対応版もあります\n\n## Installation\n\n```\ncomposer require shimabox/smbbenchmark\n```\n\n## Usage\n\n```php\n// vendor/autoload.php を読み込みます\nrequire_once '/your/path/to/vendor/autoload.php';\n```\n\n### example.1 通常利用\n\n```php\n// インスタンス生成\n$bm = SMB\\Benchmark::getInstance();\n\n// スタート\n$bm-\u003estart('bench1'); // 引数にマーキング用の値を渡す\n\n// 計測処理\nfor ($i = 0; $i \u003c 100; $i++) {\n    new stdClass();\n}\n\n// 終了\n$bm-\u003eend('bench1');\n\n// 出力\n// 小数点6桁(マイクロ秒単位)まで出力（デフォルト）\n$bm-\u003eechoResult('bench1'); // =\u003e benchmark =\u003e bench1 : 0.・・・・・・秒\n```\n\n### example.2 計測したい処理を無名関数内に書く(measure()を使う)\n\n```php\n// インスタンス生成\n$bm = SMB\\Benchmark::getInstance();\n\n// 計測したい処理をmeasure()に書く\n// measure()はcallableを引数に取ります\n$d = 4; // ローカル変数\n$bm-\u003emeasure(\n    // 第1引数に無名関数も渡せてその中に処理も書ける\n    function($a, $b, $c) use ($d) {\n        echo $a . $b . $c . $d . PHP_EOL;\n    },\n    array(1, 2, 3), // 関数に対して引数を配列で渡せる\n    'bench2' // start(),end()を使わなくてもマークできる\n);\n\n$bm-\u003eechoResult('bench2');\n\n// 関数の引数なしでマークありの場合は空の配列を第2引数に渡す\n$bm-\u003emeasure(\n    function() {\n        for ($i = 0; $i \u003c 10000; $i++) {\n            new stdClass();\n        }\n    },\n    array(),\n    'bench3'\n);\n\n// オブジェクトの関数も渡せる\nrequire_once 'Hoge.php'; // サンプル用\n\n$obj = new Hoge();\n\n$bm-\u003estart('bench4');\n$bm-\u003emeasure(array($obj, 'callbackMethod'));\n$bm-\u003eend('bench4');\n$bm-\u003eechoResult('bench4');\n\n// 引数は配列で渡す\n$bm-\u003estart('bench5');\n$bm-\u003emeasure(array($obj, 'callbackMethod'), array(1, 2, 3));\n$bm-\u003eend('bench5');\n$bm-\u003eechoResult('bench5');\n\n// 静的メソッドも測定可能\n$bm-\u003estart('bench6');\n$bm-\u003emeasure(array('Hoge', 'staticCallbackMethod'));\n$bm-\u003eend('bench6');\n$bm-\u003eechoResult('bench6');\n```\n\n### example.3 メソッドチェーン可能\n\n```php\n$bm = SMB\\Benchmark::getInstance()\n        -\u003estart('bench7')\n        -\u003emeasure(function() {\n            usleep(1000000); // 1秒\n        })\n        -\u003eend('bench7')\n        -\u003emeasure(function() {\n            usleep(500000); // 0.5秒\n        }, array(), 'bench8')\n        ;\n\n$bm-\u003eechoResult('bench7');\n$bm-\u003eechoResult('bench8');\n\n// 入れ子も可能\n$bm = SMB\\Benchmark::getInstance()\n        -\u003estart('bench9')\n        -\u003estart('bench10')\n        -\u003emeasure(function() {\n            usleep(100000); // 0.1秒\n        })\n        -\u003eend('bench10')\n        -\u003emeasure(function() {\n            usleep(50000); // 0.05秒\n        }, array(), 'bench11')\n        -\u003eend('bench9')\n        ;\n\n$bm-\u003eechoResult('bench9');  // =\u003e benchmark =\u003e bench9 : 0.15・・・・秒\n$bm-\u003eechoResult('bench10'); // =\u003e benchmark =\u003e bench10 : 0.1・・・・・秒\n$bm-\u003eechoResult('bench11'); // =\u003e benchmark =\u003e bench10 : 0.05・・・・秒\n```\n\n### example.4 すべての計測結果を出力\n\n```php\n$bm-\u003eechoResultAll(); // =\u003e bench1〜bench11までの計測結果が出力される\n```\n\n### example.5 初期化\n\n* 上記でわかる通りシングルトンなので初期化用メソッドを持っています\n\n```php\n// マーキングのクリア\n$bm-\u003eclearMark('bench11');  // bench11をクリア\n$bm-\u003eechoResult('bench11'); // =\u003e 出力なし\n$bm-\u003eechoResultAll();       // =\u003e bench1〜bench10までの計測結果が出力される\n\n// すべてのマーキングをクリア\n$bm-\u003eclearMarkAll();\n$bm-\u003eechoResultAll(); // =\u003e 出力なし\n\n// インスタンスのクリア\nSMB\\Benchmark::clear();\n```\n\n### example.6 ベンチマークの結果だけを返す\n\n```php\n// 単独の出力\n$bm = SMB\\Benchmark::getInstance()\n        -\u003emeasure(function() {\n            usleep(50000); // 0.05秒\n        }, array(), 'bench12')\n        -\u003emeasure(function() {\n            usleep(5000); // 0.005秒\n        }, array(), 'bench13')\n        ;\n\necho $bm-\u003eresult('bench12') . PHP_EOL; // =\u003e 0.05・・・・\necho $bm-\u003eresult('bench13') . PHP_EOL; // =\u003e 0.005・・・\n\n// 計測結果すべての出力\n$bm-\u003eclearMarkAll();\n$bm = SMB\\Benchmark::getInstance()\n        -\u003estart('bench14')\n        -\u003estart('bench15')\n        -\u003emeasure(function() {\n            usleep(100000); // 0.1秒\n        })\n        -\u003eend('bench15')\n        -\u003emeasure(function() {\n            usleep(50000); // 0.05秒\n        }, array(), 'bench16')\n        -\u003eend('bench14')\n        ;\n\nvar_dump($bm-\u003eresultAll()); // =\u003e array('bench14'=\u003e'0.15・・・・', 'bench15'=\u003e'0.1・・・・・', 'bench16'=\u003e'0.05・・・・')\n\n$bm-\u003eclearMarkAll();\nvar_dump($bm-\u003eresultAll()); // =\u003e array()\n```\n\n### example.7 計測対象の処理を指定した回数繰り返し実行 (結果は平均値)\n\n```php\n// SMB\\Benchmark::getInstance()-\u003emeasure();\n// 第4引数に繰り返し行う回数を指定します。\n$bm = SMB\\Benchmark::getInstance()\n        -\u003emeasure(\n            function() {\n                usleep(2000); // 0.002秒\n            },\n            array(),\n            'bench17',\n            100 // 100回繰り返す\n        )\n        ;\n\n// 結果は100回行なった結果の平均値\necho $bm-\u003eechoResult('bench17') . PHP_EOL; // benchmark =\u003e bench17 : 0.002・・・秒\n```\n\n## その他\n\n### BCMath(任意精度数学関数)を使用しています\n\n浮動小数点を扱う為、BCMath(任意精度数学関数)を使用しています。\n\n[BCMath](http://php.net/manual/ja/ref.bc.php)\n\nBCMathが使えなくても利用できますが測定結果の精度は落ちます。\n\n### BCMath(php-bcmath) のインストール方法\n\n例です。各環境に合わせて修正してください。\n\n**環境**\n```\n$ cat /etc/redhat-release # CentOS release 6.8 (Final)\n```\n\n**インストール**\n```\n# enablerepoは適宜修正\n$ sudo yum install php-bcmath --enablerepo=remi,remi-php56\n```\n\n**以下でインストールされているか確認できます**\n```\n$ yum list installed php-bcmath\nインストール済みパッケージ\nphp-bcmath.x86_64    5.6.29-1.el6.remi    @remi-php56\n```\n\n**インストールできたらapacheのreloadを行います**\n```\n$ sudo service httpd reload\n```\n\n### 出力結果の小数点を変更\n出力結果はデフォルトで小数点6桁(0.000000秒 マイクロ秒単位)まで表示されていますが、これは変更可能です。\n※小数点を少なくした場合、処理が早すぎるとほぼ0秒に丸められます\n\n変更するには ```setScale()``` を使います。\n\n```php\n// インスタンス生成\n$bm = SMB\\Benchmark::getInstance();\n\n// 小数点4桁に変更\n$bm-\u003esetScale(4);\n\n$bm-\u003estart('other1');\nfor ($i = 0; $i \u003c 1; $i++) {}\n$bm-\u003eend('other1');\n\n// 出力\n\n// 小数点4桁まで出力\n$bm-\u003eechoResult('other1'); // =\u003e benchmark =\u003e other1 : 0.XXXX秒 (処理が早過ぎると、ほぼ0.0000秒になる)\n\n\n// もちろんチェーン可能\nSMB\\Benchmark::getInstance()\n    -\u003esetScale(4)\n    -\u003emeasure(function() {}, array(), 'other2')\n    -\u003eechoResult('other2')\n    ;\n\n// 1より小さい値をセットされたらデフォルトの6桁でセットし直します。\n$bm-\u003esetScale(0); // =\u003e scaleは6になる\n```\n\n### 出力結果のフォーマットを変更\n\nechoResult(),echoResultAll() の出力フォーマットはデフォルトで\n```benchmark =\u003e {$mark} : {$benchmark}秒```ですが、\\SMB\\Benchmark\\Formatter::forEcho()を修正するか、\\SMB\\Benchmark\\IFormatterを実装したクラスを作成しセットすることで好きなフォーマットに変更可能です。\n\nこんなフォーマッターを作成したら、\n\n```php\n\u003c?php\n\nclass SampleFormatter implements SMB\\Benchmark\\IFormatter\n{\n\tpublic function forEcho($mark, $benchmark)\n\t{\n\t\treturn '\u003cpre\u003e'.$mark.'の計測時間は'.$benchmark.'秒でした\u003c/pre\u003e'.PHP_EOL;\n\t}\n}\n```\n\nこの様に使えます。\n\n```php\nrequire_once 'SampleFormatter.php'; // サンプル用\n\n$formatter = new SampleFormatter();\nSMB\\Benchmark::getInstance()\n    -\u003esetFormatter($formatter)\n    -\u003emeasure(function() {}, array(), 'bench19')\n    -\u003eechoResult('other3')\n    ; // =\u003e other3の計測時間は0.XXXXXX秒でした\n```\n\n### PHP5.3対応版\n\nこのライブラリの対象はPHP5.4以上ですが、PHP5.3でも動かしたい場合は ```SMB\\Benchmark\\PHP53\\Benchmark``` を利用してください。\n\n違いは\n\n* Benchmark::measure() 第1引数のタイプヒンティング(callable)を削除\n* 無名関数内で$thisを使うために\n  * Benchmark::resultAll(), Benchmark::echoResultAll() で$thisを退避\n  * Benchmark::existsMark(), Benchmark::calc(), Benchmark::getFormatter() のアクセス修飾子をpublicに\n\nです。(本当は配列もせっかくだから[]で扱いたかった。。)\n\n## Test\n\n* PHPUnitのバージョンは4.8.31で確認しています\n\n```\nvendor/bin/phpunit\n```\n\n## 注意点\n\n当ライブラリで出した計測結果はあくまでも目安として使ってください。\n\n## License\n\n* MIT License\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshimabox%2Fsmbbenchmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshimabox%2Fsmbbenchmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshimabox%2Fsmbbenchmark/lists"}