DBIx-Class-Async
view release on metacpan or search on metacpan
t/benchmark.pl view on Meta::CPAN
is_async => $is_async,
query_count => $query_count,
elapsed => $elapsed,
throughput => $throughput,
responsiveness => $responsiveness,
speedup => $is_async ? ($baseline_time / $elapsed) : 1,
};
}
sub print_summary {
my @results = @_;
print "\n" . "-" x 70 . "\n";
print "SUMMARY\n";
print "-" x 70 . "\n";
my @async_results = grep { $_->{is_async} } @results;
my @sync_results = grep { !$_->{is_async} } @results;
if (@async_results == 0 || @sync_results == 0) {
print "No results to summarize.\n";
exit;
}
my $avg_speedup = 0;
my $max_speedup = 0;
my $avg_responsiveness = 0;
foreach my $result (@async_results) {
$avg_speedup += $result->{speedup};
$max_speedup = $result->{speedup}
if $result->{speedup} > $max_speedup;
$avg_responsiveness += $result->{responsiveness};
}
$avg_speedup /= scalar @async_results;
$avg_responsiveness /= scalar @async_results;
my $total_sync_time = 0;
my $total_async_time = 0;
$total_sync_time += $_->{elapsed} for @sync_results;
$total_async_time += $_->{elapsed} for @async_results;
my $total_time_saved = $total_sync_time - $total_async_time;
my $total_improvement = $total_sync_time > 0
? ($total_time_saved / $total_sync_time * 100)
: 0;
printf "Across all %d test runs:\n", scalar(@results) / 2;
printf "\nPerformance Results:\n";
printf " - Average Speedup: %.2fx faster\n", $avg_speedup;
printf " - Maximum Speedup: %.2fx faster\n", $max_speedup;
printf " - Total Time (Sync): %.4f seconds\n", $total_sync_time;
printf " - Total Time (Async): %.4f seconds\n", $total_async_time;
printf " - Time Saved: %.4f seconds (%.1f%% improvement)\n",
$total_time_saved, $total_improvement;
printf "\nEvent Loop Health:\n";
printf " - Average Responsiveness: %.1f%%\n", $avg_responsiveness;
printf " - Sequential Blocking: 0.0%% (completely blocked)\n";
print "\n What This Means:\n";
print " - TRUE parallel query execution across network connections\n";
if ($avg_speedup > 50) {
printf " - Exceptional performance: %.0fx faster with worker pool\n", $avg_speedup;
print " - Worker process caching and connection reuse is highly effective\n";
}
elsif ($avg_speedup > 2) {
printf " - Strong performance: %.1fx faster with parallelism\n", $avg_speedup;
}
else {
printf " - Similar speed (%.1fx), but with %.1f%% event loop responsiveness\n",
$avg_speedup, $avg_responsiveness;
}
print " - Non-blocking event loop maintains application responsiveness\n";
print " - Better scalability as query count increases\n";
if ($max_speedup > 100) {
print "\nKey Insight: Worker pool caching delivered exceptional results!\n";
print "After warm-up, persistent workers with cached connections and\n";
print "prepared statements achieved extraordinary parallel throughput.\n";
} elsif (@sync_results && $sync_results[0]->{query_count}) {
my $avg_query_time = ($sync_results[0]->{elapsed} / $sync_results[0]->{query_count} * 1000);
print "\nKey Insight: Network latency makes parallelism highly effective!\n";
printf "Each query has ~%.1fms of overhead. With 4 workers, parallel\n", $avg_query_time;
print "execution dramatically reduces total execution time.\n";
}
print "\n";
}
( run in 2.313 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )