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 )