EV-Future
view release on metacpan or search on metacpan
bench/benchmark.pl view on Meta::CPAN
use strict;
use warnings;
use EV;
use EV::Future;
use Time::HiRes qw(time);
my $COUNT = 100;
my $ITERATIONS = 50000;
# Reuse tasks to avoid allocation overhead in loop
my @tasks = map { sub { my $d = shift; $d->() } } 1..$COUNT;
sub run_bench {
my ($name, $code) = @_;
print "Running $name...\n";
my $start = time;
for (1..$ITERATIONS) {
$code->();
}
my $end = time;
my $elapsed = $end - $start;
printf "%-30s: %8.4fs (%10.2f/s)\n", $name, $elapsed, $ITERATIONS / $elapsed;
}
print "Benchmarking $COUNT synchronous tasks over $ITERATIONS iterations:\n";
run_bench('EV::Future::parallel', sub {
EV::Future::parallel(\@tasks, sub { });
});
run_bench('EV::Future::parallel (unsafe)', sub {
EV::Future::parallel(\@tasks, sub { }, 1);
});
run_bench('EV::Future::parallel_limit(10)', sub {
EV::Future::parallel_limit(\@tasks, 10, sub { });
});
run_bench('EV::Future::parallel_limit(10,unsafe)', sub {
EV::Future::parallel_limit(\@tasks, 10, sub { }, 1);
});
run_bench('EV::Future::series', sub {
EV::Future::series(\@tasks, sub { });
});
run_bench('EV::Future::series (unsafe)', sub {
EV::Future::series(\@tasks, sub { }, 1);
});
run_bench('naive_parallel_non_recursive', sub {
naive_parallel_non_recursive(\@tasks, sub { });
});
run_bench('naive_series_non_recursive', sub {
naive_series_non_recursive(\@tasks, sub { });
});
sub naive_series_non_recursive {
my ($tasks, $final_cb) = @_;
my $idx = 0;
my $len = @$tasks;
return $final_cb->() if $len == 0;
my $running = 0;
my $delayed = 0;
my $next;
$next = sub {
if ($running) {
$delayed = 1;
return;
}
$running = 1;
$delayed = 1;
while ($delayed) {
$delayed = 0;
if ($idx >= $len) {
$final_cb->();
last;
}
my $task = $tasks->[$idx];
$idx++;
$task->($next);
}
$running = 0;
};
( run in 0.983 second using v1.01-cache-2.11-cpan-71847e10f99 )