Hypersonic

 view release on metacpan or  search on metacpan

bench/wrk.pl  view on Meta::CPAN

    if ($dancer_pid == 0) {
        eval q{
            package BenchDancer;
            use Dancer2;
            set logger => 'Null';
            set show_errors => 0;
            get '/hello' => sub { 'Hello, World!' };
            
            require Plack::Runner;
            my $runner = Plack::Runner->new;
            $runner->parse_options(
                '--port' => $dancer_port,
                '--server' => 'HTTP::Server::PSGI',
                '--env' => 'production',
            );
            $runner->run(BenchDancer->to_app);
        };
        exit(0);
    }
    push @pids, $dancer_pid;
    
    sleep(2);
    
    my $dancer_result = benchmark_with_wrk("Dancer2", $dancer_port);
    push @results, $dancer_result if $dancer_result;
}

# ============================================================================
# Cleanup and Summary
# ============================================================================

print "Shutting down servers...\n";
for my $pid (@pids) {
    kill('TERM', $pid);
    waitpid($pid, 0);
}

system("rm -rf _bench_wrk_*");

print "\n";
print "=" x 70, "\n";
print "SUMMARY - Requests/sec (higher is better)\n";
print "=" x 70, "\n\n";

@results = sort { $b->{rps} <=> $a->{rps} } @results;

if (@results) {
    my $baseline = $results[0]->{rps};
    
    printf "%-20s %15s %12s %10s\n", "Framework", "Req/sec", "Latency(ms)", "Relative";
    print "-" x 60, "\n";
    
    for my $r (@results) {
        my $relative = $r->{rps} / $baseline;
        printf "%-20s %15.0f %12.2f %9.1fx\n", 
               $r->{name}, $r->{rps}, $r->{latency}, $relative;
    }
}

print "\n";
print "Note: wrk uses connection pooling (keep-alive) for maximum throughput.\n";
print "Run with: perl bench/wrk.pl [duration] [threads] [connections]\n";



( run in 0.318 second using v1.01-cache-2.11-cpan-5b529ec07f3 )