EV-Future
view release on metacpan or search on metacpan
bench/comparison.pl view on Meta::CPAN
my $p = Promise::XS::resolved();
for (1..$COUNT) {
$p = $p->then(sub { return Promise::XS::resolved(); });
}
}
sub bench_future_xs_series {
my $f = Future::XS->done;
for (1..$COUNT) {
$f = $f->then(sub { return Future::XS->done; });
}
}
# Stack-safe and highly efficient AnyEvent series implementation
sub bench_anyevent_series_stack_safe {
my $cv = AE::cv;
my $idx = 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 >= $COUNT) {
$cv->send;
last;
}
my $task = $tasks[$idx++];
$task->($next);
}
$running = 0;
};
$next->();
$cv->recv;
}
# --- Parallel Limit Benchmarks ---
sub bench_ev_future_parallel_limit {
EV::Future::parallel_limit(\@tasks, 10, sub { });
}
sub bench_ev_future_parallel_limit_unsafe {
EV::Future::parallel_limit(\@tasks, 10, sub { }, 1);
}
sub bench_future_fmap_void {
my @items = 1..$COUNT;
my $f = fmap_void {
return Future->done;
} foreach => \@items, concurrent => 10;
$f->get;
}
print "Benchmarking $COUNT tasks ($ITERATIONS iterations):\n";
print "\n--- PARALLEL ---\n";
timethese($ITERATIONS, {
'EV::Future::parallel' => \&bench_ev_future_parallel,
'EV::Future::parallel (unsafe)' => \&bench_ev_future_parallel_unsafe,
'Promise::XS::all' => \&bench_promise_xs_parallel,
'Future::XS::wait_all' => \&bench_future_xs_parallel,
'AnyEvent::cv (begin/end)' => \&bench_anyevent_parallel,
});
print "\n--- PARALLEL LIMIT (10) ---\n";
timethese($ITERATIONS, {
'EV::Future::parallel_limit' => \&bench_ev_future_parallel_limit,
'EV::Future::parallel_limit (unsafe)' => \&bench_ev_future_parallel_limit_unsafe,
'Future::Utils::fmap_void' => \&bench_future_fmap_void,
});
print "\n--- SERIES ---\n";
timethese($ITERATIONS, {
'EV::Future::series' => \&bench_ev_future_series,
'EV::Future::series (unsafe)' => \&bench_ev_future_series_unsafe,
'Promise::XS (chain)' => \&bench_promise_xs_series,
'Future::XS (chain)' => \&bench_future_xs_series,
'AnyEvent::cv (stack-safe)' => \&bench_anyevent_series_stack_safe,
});
( run in 1.019 second using v1.01-cache-2.11-cpan-71847e10f99 )