perf/aggregate: add --sort-by=regression option
authorChristian Couder <christian.couder@gmail.com>
Mon, 26 Mar 2018 07:24:31 +0000 (09:24 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 28 Mar 2018 00:04:07 +0000 (17:04 -0700)
One of the most interesting thing one can be interested in when
looking at performance test results is possible performance
regressions.

This new option makes it easy to spot such possible regressions.

This new option is named '--sort-by=regression' to make it
possible and easy to add other ways to sort the results, like for
example '--sort-by=utime'.

If we would like to sort according to how much the stime regressed
we could also add a new option called '--sort-by=regression:stime'.
Then '--sort-by=regression' could become a synonym for
'--sort-by=regression:rtime'.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/perf/aggregate.perl
index 890d85fa7bc00ed86f7c8c9b7215d8b9a836d185..48637ef64bb658098d8bc1d0f00eba87f7daa681 100755 (executable)
@@ -37,7 +37,7 @@ sub format_times {
 }
 
 my (@dirs, %dirnames, %dirabbrevs, %prefixes, @tests,
-    $codespeed, $subsection, $reponame);
+    $codespeed, $sortby, $subsection, $reponame);
 while (scalar @ARGV) {
        my $arg = $ARGV[0];
        my $dir;
@@ -46,6 +46,18 @@ sub format_times {
                shift @ARGV;
                next;
        }
+       if ($arg =~ /--sort-by(?:=(.*))?/) {
+               shift @ARGV;
+               if (defined $1) {
+                       $sortby = $1;
+               } else {
+                       $sortby = shift @ARGV;
+                       if (! defined $sortby) {
+                               die "'--sort-by' requires an argument";
+                       }
+               }
+               next;
+       }
        if ($arg eq "--subsection") {
                shift @ARGV;
                $subsection = $ARGV[0];
@@ -209,6 +221,49 @@ sub print_default_results {
        }
 }
 
+sub print_sorted_results {
+       my ($sortby) = @_;
+
+       if ($sortby ne "regression") {
+               die "only 'regression' is supported as '--sort-by' argument";
+       }
+
+       my @evolutions;
+       for my $t (@subtests) {
+               my ($prevr, $prevu, $prevs, $prevrev);
+               for my $i (0..$#dirs) {
+                       my $d = $dirs[$i];
+                       my ($r, $u, $s) = get_times("$resultsdir/$prefixes{$d}$t.times");
+                       if ($i > 0 and defined $r and defined $prevr and $prevr > 0) {
+                               my $percent = 100.0 * ($r - $prevr) / $prevr;
+                               push @evolutions, { "percent"  => $percent,
+                                                   "test"     => $t,
+                                                   "prevrev"  => $prevrev,
+                                                   "rev"      => $d,
+                                                   "prevr"    => $prevr,
+                                                   "r"        => $r,
+                                                   "prevu"    => $prevu,
+                                                   "u"        => $u,
+                                                   "prevs"    => $prevs,
+                                                   "s"        => $s};
+                       }
+                       ($prevr, $prevu, $prevs, $prevrev) = ($r, $u, $s, $d);
+               }
+       }
+
+       my @sorted_evolutions = sort { $b->{percent} <=> $a->{percent} } @evolutions;
+
+       for my $e (@sorted_evolutions) {
+               printf "%+.1f%%", $e->{percent};
+               print " " . $e->{test};
+               print " " . format_times($e->{prevr}, $e->{prevu}, $e->{prevs});
+               print " " . format_times($e->{r}, $e->{u}, $e->{s});
+               print " " . display_dir($e->{prevrev});
+               print " " . display_dir($e->{rev});
+               print "\n";
+       }
+}
+
 sub print_codespeed_results {
        my ($subsection) = @_;
 
@@ -263,6 +318,8 @@ sub print_codespeed_results {
 
 if ($codespeed) {
        print_codespeed_results($subsection);
+} elsif (defined $sortby) {
+       print_sorted_results($sortby);
 } else {
        print_default_results();
 }