1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#!/usr/bin/perl
use strict;
use warnings;
my %keys;
sub read_file {
my ($filename) = @_;
my $header = "";
my $results = {};
my $in_header = 1;
open FILE, $filename;
while (defined ($_ = <FILE>)) {
if (/^$/) {
$in_header = 0;
} elsif ($in_header) {
$header .= $_;
} elsif (/^(\S*):\s+(.*)/) {
my $name = $1;
my $value = $2;
$keys{$name} = 1;
if ($value =~ /^[0-9]+ runs take ([0-9.]+)ms(?:, mean.*)?$/) {
$results->{$name} = $1;
} else {
$results->{$name} = -1;
}
} else {
die "$filename: unregonised line: $_"
}
}
close FILE;
return ($header, $results);
}
sub filter_result {
my ($result) = @_;
if (!defined $result) {
return "N/A";
} elsif ($result < 0) {
return "FAILED";
} else {
return sprintf ("%.3f", $result);
}
}
if (@ARGV != 2) {
die "Usage: <before> <after>\n";
}
my ($before_header, $before_results) = read_file ($ARGV[0]);
my ($after_header, $after_results) = read_file ($ARGV[1]);
my $format = "%-40s %10s %10s : %7s\n";
my $last_format = "%64s : %6.3fx\n";
my $bar = ("-" x (length (sprintf ($format, "", "", "", "")) - 1))."\n";
my $diffs = 0;
my $mean = 1;
printf "Before\n";
printf "======\n\n";
printf $before_header;
printf "\n";
printf "After\n";
printf "=====\n\n";
printf $after_header;
printf "\n";
printf $format, "Test", "Before", "After", "Improv";
printf $bar;
foreach my $key (sort (keys %keys)) {
my $bv = $before_results->{$key};
my $av = $after_results->{$key};
my $diff;
if (defined $bv && defined $av && $bv >= 0 && $av >= 0) {
$diff = sprintf ("%6.3fx", $bv / $av);
$diffs++;
$mean *= $bv / $av;
} else {
$diff = "N/A";
}
$bv = filter_result ($bv);
$av = filter_result ($av);
printf $format, $key, $bv, $av, $diff;
}
if ($diffs != 0) {
printf $bar;
printf $last_format, "Geometric mean", $mean ** (1.0 / $diffs);
}
|