Data-Monad-CondVar

 view release on metacpan or  search on metacpan

eg/bench_cv.pl  view on Meta::CPAN


sub monad_for($$) {
    my ($cv1, $cv2) = @_;
    Data::Monad::Base::Sugar::for {
        pick \my $x => sub { $cv1 };
        pick \my $y => sub { $cv2 };
        yield {$x * $y};
    }->recv;
}

sub coro($$) {
    my ($cv1, $cv2) = @_;
    async {
        my $x = $cv1->recv;
        my $y = $cv2->recv;
        $x * $y;
    }->join;
}

my $r = Benchmark::timethese($count => {
    bare_ae   => sub { bare_ae(cv 5, cv 4)   },
    monad_for => sub { monad_for(cv 5, cv 4) },
    monad     => sub { monad(cv 5, cv 4)     },
    monad_lift=> sub { monad_lift(cv 5, cv 4)},
    coro      => sub { coro(cv 5, cv 4)      },
});
for my $v (values %$r) {
    $v->[1] = $v->[3] = $v->[0];
    $v->[2] = $v->[4] = 0;
}
Benchmark::cmpthese($r);

__END__

% perl -Ilib eg/bench_cv.pl .0001 10000
Benchmark: timing 10000 iterations of bare_ae, coro, monad, monad_for, monad_lift...
   bare_ae: 1.16068 wallclock secs ( 0.72 usr +  0.06 sys =  0.78 CPU) @ 12820.51/s (n=10000)
      coro: 1.16513 wallclock secs ( 0.72 usr +  0.06 sys =  0.78 CPU) @ 12820.51/s (n=10000)
     monad: 1.10253 wallclock secs ( 0.87 usr +  0.05 sys =  0.92 CPU) @ 10869.57/s (n=10000)
 monad_for: 1.21874 wallclock secs ( 1.18 usr +  0.03 sys =  1.21 CPU) @ 8264.46/s (n=10000)
monad_lift: 1.33561 wallclock secs ( 1.30 usr +  0.03 sys =  1.33 CPU) @ 7518.80/s (n=10000)
             Rate monad_lift  monad_for       coro    bare_ae      monad
monad_lift 3744/s         --        -9%       -13%       -13%       -17%
monad_for  4103/s        10%         --        -4%        -5%       -10%
coro       4291/s        15%         5%         --        -0%        -5%
bare_ae    4308/s        15%         5%         0%         --        -5%
monad      4535/s        21%        11%         6%         5%         --

% perl -Ilib eg/bench_cv.pl 0 20000
Benchmark: timing 20000 iterations of bare_ae, coro, monad, monad_for, monad_lift...
   bare_ae: 0.991276 wallclock secs ( 0.94 usr +  0.04 sys =  0.98 CPU) @ 20408.16/s (n=20000)
      coro: 1.01837 wallclock secs ( 0.97 usr +  0.05 sys =  1.02 CPU) @ 19607.84/s (n=20000)
     monad: 1.7295 wallclock secs ( 1.68 usr +  0.04 sys =  1.72 CPU) @ 11627.91/s (n=20000)
 monad_for: 2.51117 wallclock secs ( 2.44 usr +  0.06 sys =  2.50 CPU) @ 8000.00/s (n=20000)
monad_lift: 2.69432 wallclock secs ( 2.63 usr +  0.07 sys =  2.70 CPU) @ 7407.41/s (n=20000)
              Rate monad_lift  monad_for      monad       coro    bare_ae
monad_lift  3712/s         --        -7%       -36%       -62%       -63%
monad_for   3982/s         7%         --       -31%       -59%       -61%
monad       5782/s        56%        45%         --       -41%       -43%
coro        9820/s       165%       147%        70%         --        -3%
bare_ae    10088/s       172%       153%        74%         3%         --

eg/bench_cv_light.pl  view on Meta::CPAN

            $done->send($v);
        });
    });
    $done->recv;
}

sub monad() {
    plus2(1)->flat_map(\&mult2)->recv;
}

sub coro() {
    async {
        mult2(plus2(1)->recv)->recv;
    }->join;
}

my $r = Benchmark::timethese($count => {
    bare_ae => \&bare_ae,
    monad   => \&monad,
    coro    => \&coro,
});
for my $v (values %$r) {
    $v->[1] = $v->[3] = $v->[0];
    $v->[2] = $v->[4] = 0;
}
Benchmark::cmpthese($r);

__END__

% perl -Ilib eg/bench_cv_light.pl 0 20000
Benchmark: timing 20000 iterations of bare_ae, coro, monad...
   bare_ae: 1.05725 wallclock secs ( 0.98 usr +  0.07 sys =  1.05 CPU) @ 19047.62/s (n=20000)
      coro: 1.02733 wallclock secs ( 0.95 usr +  0.08 sys =  1.03 CPU) @ 19417.48/s (n=20000)
     monad: 1.10444 wallclock secs ( 1.03 usr +  0.07 sys =  1.10 CPU) @ 18181.82/s (n=20000)
          Rate   monad bare_ae    coro
monad   9054/s      --     -4%     -7%
bare_ae 9458/s      4%      --     -3%
coro    9734/s      8%      3%      --



( run in 0.272 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )