サーバや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) の返す結果を書き換える必要がある。