~rsandifo/+junk/loop-microbenchmarks

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);
}