Perl - Benchmark


DESCRIPTION

Модуль Benchmark, инкапсулирует ряд подпрограм, которые помогут определить сколько времени потребуется для выполнения некоторого кода.

  • timethese - выполнить несколько фрагментов кода несколько раз
  • cmpthese - распечатать результаты timethese в виде сравнительной диаграммы
  • countit - посмотреть сколько раз часть кода запуститься за указанное время

  • timeit(COUNT, CODE) - запустить часть кода и посмотреть как долго он работает. COUNT - сколько раз запускать код. CODE - может быть как строкой, ссылкой на coderef или eval-ом.
    Возвращает обьект Benchmark

use Benchmark;

my $res = timeit(100, sub { for (0..1000000){}; });
print "Result: " . timestr($res) . "\n\n";

$ perl benchmark.pl  
Result:  4 wallclock secs ( 3.29 usr +  0.01 sys =  3.30 CPU) @ 30.30/s (n=100)
  • timethis( COUNT, CODE, [ TITLE, [ STYLE ]] ) - выполнить часть кода несколько раз.
    COUNT - сколько раз запускать, CODE - что запускать, TITLE - заголовок теста, STYLE - формат как для timestr()
    Результат будет выведен в STDOUT

PS. COUNT может быть нулем либо отрицательным значением. В таком случае код будет повторятся в течении COUNT секунд. 0 - 3 сек.


use Benchmark;

timethis(100, sub { for (0..200000){}; }, "Привет", 'noс');

$ perl benchmark.pl 
Привет: 1 0.65 0 0 0 100 noс @ 153.85/s (n=100)

timethis(0, sub { for (0..200000){}; } );

$ perl benchmark.pl 
timethis for 3:  4 wallclock secs ( 3.22 usr +  0.01 sys =  3.23 CPU) @ 150.77/s (n=487)

or to run two pieces of code tests for at least 3 seconds:


my @words = (qw(dsa dsafq fwqnjvreniop jop jop rkej[pb rekop[verw verwkobp[rewmboefr4 )) x 1200;

timethese(0, {
    foreach => sub {
        my %hash;
        foreach my $word ( @words ){
            $hash{ $word }++;
        }
    },
    for     => sub {
        my %hash;
        for ( @words ){
            $hash{ $_ }++;
        }
    }
});

$ perl benchmark.pl 
Benchmark: running for, foreach for at least 3 CPU seconds...
       for:  4 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 908.70/s (n=2926)
   foreach:  4 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 918.94/s (n=2959)

Примеры

Сколько выполняется часть кода между start и end

use Benchmark;

my $start = Benchmark->new();

for ( 0..20000000 ){};

my $end = Benchmark->new();
my $diff = timediff($start, $end);
print "Code took: " . timestr($diff) . "\n\n";

$ perl benchmark.pl  
Code took: -1 wallclock secs (-0.66 usr +  0.00 sys = -0.66 CPU)

TODO: 10-07-2018 17:00