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 )