PHP 用ベンチマーキングフレームワーク Joshimane というのを作った
2011-02-06 20:02:33
あくまでもプロトタイプですが.
プロトタイプなので, API は大幅に変わると思います.
使用イメージ
以下のようにして使用します.
これを実行すると, 以下のような結果が得られます.
$ php example.php Job A: 0.52975106 Job B: 0.26065207
一応補足すると, Job A ではループ時に毎回 (つまり 100 回) count($range) が実行されるのに対して, Job B ではループの開始前に一度だけしか count($range) が実行されないので, これだけの差が出ます.
名前について
女子マネです.
なんかこう... 陸上部の女子マネージャが測ってくれているんだ ! っていう気にさせる名前にしたいけど, それを即思いつくだけの語彙を持たないので辛い.
@yuya_takeyama そのまま Joshimane とかw
作成動機
- PEAR の Benchmark はいい加減レガシー臭が...
$obj =& new Foo; とかやめたいですよね. - テスト対象のジョブ間の依存関係を無くしたい.
無名関数を使うことで, その中で生成した変数はローカル変数となり, Job A のせいで Job B がおかしなことに ! ということはありません. (多分) - 10,000 回実行してその平均時間を取得... とかいうのはフレームワークにやらせたい.
ある程度繰り返し実行しないと, ベンチマーク結果として信頼できないでしょう.
これも無名関数で実現しています.
問題点
- コンテキスト依存のベンチマークが取り辛い.
例えば既にバッチ処理を行うスクリプトがあって, その中でどこに時間がかかっているのか, というのを計測するのには向きません.
そういうときは PEAR の Benchmark をスクリプト中のあちこちに埋め込む方が簡単かもしれません.
しかし, Joshimane としては, 単体テスト性を意識してこうなっているので, これは気にしない方向です.
課題
- ベンチマーク結果をより詳細なものにする.
今回は N 回実行時の総経過時間のみとなっていますが, 平均時間や, メモリ使用量なんかも取れるといいのではと思っています. - フォーマッタの実装.
ベンチマーク結果を見やすく整形してくれるフォーマッタがあると便利でしょう.
プラガブルな感じで, CSV や XML の出力にも対応するのが理想. - TestSuite 方式の実装.
要はテスト対象のジョブのグループ化です.
そのためには, ジョブごとに ID なり表題なりをつけて, 識別するための仕組みが必要でしょう.
ただし, これについては実装するか迷い中. - より実装をモダンに.
とりあえずは名前空間を使用して階層化しようと思っています.
普段の仕事が PHP 5.2 ということもあり, 構文等を思い出すのに時間がかかるので, プロトタイプの段階では使用しませんでした. - 命名.
このままだと Openpear に登録する上ではさすがにアレだと思うので, もっと一般的な名前にする方向で.
Joshimane はあくまでもコードネームということで...
(良い名前をつけることの重要性はでも, 森田創さんとまつもとゆきひろさんに言及されていますね.)
気が向いたときにでも少しずつ開発を進めようと思います.