ベンチマーク


 処理時間を計測する場合にはBenchmarkモジュールが便利です。
 次のサンプルで500となっているところは繰り返し実行する回数の指定です。この部分に負数を指定すると、指定した数の秒数分CPUを消費するまで繰り返すようになります。
use strict;
use warnings;
use Benchmark qw(:all);

timethese (500,
    {
        test_a => sub {
            my $a = 0;
            for (my $i = 0; $i < 10000; $i++) {
                $a++;
            }
        },
        test_b => sub {
            my $a = 0;
            foreach (1 .. 10000) {
                $a++;
            }
        }
    }
);
 実行すると以下のような結果を出力します。
Benchmark: timing 500 iterations of test_a, test_b...
    test_a:  6 wallclock secs ( 2.24 usr +  0.00 sys =  2.24 CPU) @ 222.92/s (n=500)
    test_b:  4 wallclock secs ( 1.62 usr +  0.00 sys =  1.62 CPU) @ 308.26/s (n=500)
 timetheseの代わりにcmptheseを使うとそれぞれの実行結果の比較表を出力します。
use strict;
use warnings;
use Benchmark qw(:all);

cmpthese (500,
    {
        test_a => sub {
            my $a = 0;
            for (my $i = 0; $i < 10000; $i++) {
                $a++;
            }
        },
        test_b => sub {
            my $a = 0;
            foreach (1 .. 10000) {
                $a++;
            }
        }
    }
);
        Rate test_a test_b
test_a 217/s     --   -19%
test_b 267/s    23%     --
 両方出したいときはtimetheseとcmptheseを両方書きます。
use strict;
use warnings;
use Benchmark qw(:all);

cmpthese timethese (500,
    {
        test_a => sub {
            my $a = 0;
            for (my $i = 0; $i < 10000; $i++) {
                $a++;
            }
        },
        test_b => sub {
            my $a = 0;
            foreach (1 .. 10000) {
                $a++;
            }
        }
    }
);
Benchmark: timing 500 iterations of test_a, test_b...
    test_a:  6 wallclock secs ( 2.26 usr +  0.00 sys =  2.26 CPU) @ 220.95/s (n=500)
    test_b:  4 wallclock secs ( 2.05 usr +  0.00 sys =  2.05 CPU) @ 243.55/s (n=500)
        Rate test_a test_b
test_a 221/s     --    -9%
test_b 244/s    10%     --

関連項目

times関数
プロファイラ
CGIのプロファイルを取得
メトリクスの取得