2014/04/29

Perl のベンチマークを気軽にする Benchmarks 書いた

Perl でベンチマークとるなら Benchmark モジュールが鉄板。僕も Benchmark モジュールを使ったベンチ用のテンプレートを用意していて、必要になったらそれを書き換えてベンチをとるのだけど、ベンチ自体はたまにしか書かないから、cmpthese とか timethese とかごっちゃに記憶してたりしてそらで書けなくて困る。ほんとはもっと思いついた時にぱっとワンライナーで書けるくらいに気楽にならないかなとずっと思ってた。

そういうわけで、Perl のベンチをもっと気軽にするモジュールを書いた。

Benchmarks

Benchmarks という名前がだいぶ攻めてるが、最初 Benchmark::Simple とかにしようかと思ったけど、あれ、Benchmark::Lite だったっけ?、みたいなのが嫌だったので、s つけるだけにした。

ルーチン同士を比較するベンチをとっても簡単にする。

use Benchmarks sub {
    my $x = 1;
    +{
        times => sub { $x * $x },
        raise => sub { $x ** 2 },
    };
};

関数とか一切覚える必要なし。
use Benchmarks; して、比較したいコードが並んだハッシュリファレンスを返すコードリファレンスを引数に与えるだけ。

カウントを指定したい場合は、第三引数でくっつける。

use Benchmarks sub {
    my $x = 1;
    +{
        times => sub { $x * $x },
        raise => sub { $x ** 2 },
    };
}, 1000_000;

use 時点であらゆることをしようとするので、ベンチマークの内容によっては逆に使い勝手が悪いかもしれない(が、たいていはこれでいけますよね)。

もし、通常の Benchmark モジュールの方を使いたくなった場合は、use Benchmarks の引数をはずせば、Benchmarkモジュールの関数群はそのまま全てエクスポートされているので、まんま使える。

use Benchmarks;

timethis(1000_000, sub { bless +{}, 'Foo' } );

レッツベンチナウ!

サイト内検索