perf/aggregate: implement codespeed JSON output

Codespeed (https://github.com/tobami/codespeed/) is an open source
project that can be used to track how some software performs over
time. It stores performance test results in a database and can show
nice graphs and charts on a web interface.

As it can be interesting to use Codespeed to see how Git performance
evolves over time and releases, let's implement a Codespeed output
in "perf/aggregate.perl".

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Christian Couder 2018-01-05 10:12:22 +01:00 committed by Junio C Hamano
parent 30ffff6ee2
commit 05eb1c37ed

View File

@ -3,6 +3,7 @@
use lib '../../perl/blib/lib';
use strict;
use warnings;
use JSON;
use Git;
sub get_times {
@ -35,10 +36,15 @@ sub format_times {
return $out;
}
my (@dirs, %dirnames, %dirabbrevs, %prefixes, @tests);
my (@dirs, %dirnames, %dirabbrevs, %prefixes, @tests, $codespeed);
while (scalar @ARGV) {
my $arg = $ARGV[0];
my $dir;
if ($arg eq "--codespeed") {
$codespeed = 1;
shift @ARGV;
next;
}
last if -f $arg or $arg eq "--";
if (! -d $arg) {
my $rev = Git::command_oneline(qw(rev-parse --verify), $arg);
@ -70,8 +76,10 @@ if (not @tests) {
}
my $resultsdir = "test-results";
my $results_section = "";
if (exists $ENV{GIT_PERF_SUBSECTION} and $ENV{GIT_PERF_SUBSECTION} ne "") {
$resultsdir .= "/" . $ENV{GIT_PERF_SUBSECTION};
$results_section = $ENV{GIT_PERF_SUBSECTION};
}
my @subtests;
@ -174,6 +182,58 @@ sub print_default_results {
}
}
sub print_codespeed_results {
my ($results_section) = @_;
my $project = "Git";
my $executable = `uname -s -m`;
chomp $executable;
if ($results_section ne "") {
$executable .= ", " . $results_section;
}
my $environment;
if (exists $ENV{GIT_PERF_REPO_NAME} and $ENV{GIT_PERF_REPO_NAME} ne "") {
$environment = $ENV{GIT_PERF_REPO_NAME};
} elsif (exists $ENV{GIT_TEST_INSTALLED} and $ENV{GIT_TEST_INSTALLED} ne "") {
$environment = $ENV{GIT_TEST_INSTALLED};
$environment =~ s|/bin-wrappers$||;
} else {
$environment = `uname -r`;
chomp $environment;
}
my @data;
for my $t (@subtests) {
for my $d (@dirs) {
my $commitid = $prefixes{$d};
$commitid =~ s/^build_//;
$commitid =~ s/\.$//;
my ($result_value, $u, $s) = get_times("$resultsdir/$prefixes{$d}$t.times");
my %vals = (
"commitid" => $commitid,
"project" => $project,
"branch" => $dirnames{$d},
"executable" => $executable,
"benchmark" => $shorttests{$t} . " " . read_descr("$resultsdir/$t.descr"),
"environment" => $environment,
"result_value" => $result_value,
);
push @data, \%vals;
}
}
print to_json(\@data, {utf8 => 1, pretty => 1}), "\n";
}
binmode STDOUT, ":utf8" or die "PANIC on binmode: $!";
print_default_results();
if ($codespeed) {
print_codespeed_results($results_section);
} else {
print_default_results();
}