#!/usr/bin/perl -w use strict; sub average { my $n = 0; my $s = 0; $n++, $s+=$_ foreach @_; $s/$n; } sub min { my $m = shift; ($_ < $m) and $m = $_ foreach @_; $m; } sub max { my $m = shift; ($_ > $m) and $m = $_ foreach @_; $m; } my %times; my %benchmarks; my %runtimes; my %gctimes; { my $curtime; my $curbench; my $counter = 0; open F, "){ if (/^NOW: (.*)/){ $curtime = $1; $times{$curtime} = ++$counter; next; } if(/^running stats for (.*):$/){ $curbench = $1; $benchmarks{$curbench} ||= ++$counter; next; } if(/^ *(\d*) ms elapsed cpu time, including (\d*) ms collecting$/){ push @{$runtimes{$curbench}{$curtime}}, $1; push @{$gctimes{$curbench}{$curtime}}, $2; next; } } close F; } my @times = sort { $times{$a} <=> $times{$b} } keys %times; my @benchmarks = sort { $benchmarks{$a} <=> $benchmarks{$b} } keys %benchmarks; my $verbose = 0; foreach my $bench (@benchmarks){ print "benchmark: $bench\n"; my $prev = 0; foreach my $time (@times){ defined $runtimes{$bench}{$time} or next; my @times = @{$runtimes{$bench}{$time}}; my $t = min(@times); if($prev){ my $diff = (($t - $prev) / $prev) * 100; printf " %6d %6s on $time\n", $t, sprintf("(%s%d%%)", ($diff>0) ? "+" : ($diff<0) ? "-" : "", abs $diff); } else { printf " %6d on $time\n", $t; } $prev = $t; } }