サーバやI/O待ちを含むベンチマークを Benchmark::cmpthese で比較してはいけない、という話
Benchmark.pm の cmpthese は手軽に速度の比較ができるのでとても便利。でも、そもそも何のパフォーマンスを比較しているのか? ソースコードを読めばわかるけど、
- perl プロセスのCPU使用時間
- あるいは、上記+子プロセスのCPU使用時間
を測定している。換言すると、プロセス間通信のオーバーヘッドやサーバ側での処理時間はベンチマーク結果に反映されない。つまり、サーバのベンチマーク(あるいはプロセス間通信やI/O待ちを含むベンチマーク)を比較したい場合には、cmpthese を使うべきではない。
#サーバと通信するクライアントモジュールのベンチマークがほしい、といった場合はOK
どうしても Benchmark.pm を使いたいなら、
use Benchmark qw(:hireswallclock); my $r = timethese(...); for my $v (values %$r) { $v->[1] = $v->[3] = $v->[0]; $v->[2] = $v->[4] = 0; } cmpthese($r);
などとして、times(3) の返す結果を書き換える必要がある。