aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2017-06-08 12:26:58 +0000
committerChristophe Lyon <christophe.lyon@linaro.org>2018-03-23 16:01:08 +0000
commitc4db960bd9853f7758a386f892dac7c2fa8be49f (patch)
treed8817146d2d42f4c5b3aa96f9553c07b5ffa1a7f
parentfbd99fd283390670ce311c27a05888c75f34e744 (diff)
compare.pl: New script.
This is the script we use in ST. Imported from: https://gist.githubusercontent.com/guillon/209529c084fec0d13174d2d8e1f872b5/raw/1dc54e3307a9dd0bc32d77920b59594631d04a31/compare.pl Change-Id: I7b7fad0a3045ea513a4c2af96d5ea6f200440ec0
-rwxr-xr-xcompare.pl431
1 files changed, 431 insertions, 0 deletions
diff --git a/compare.pl b/compare.pl
new file mode 100755
index 0000000..319ccfa
--- /dev/null
+++ b/compare.pl
@@ -0,0 +1,431 @@
+: # use perl
+eval 'exec perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
+
+# compare two result files, whose line format is: unit key value
+
+use strict;
+use Getopt::Long;
+
+my $me;
+my $rdb;
+my $size; # if true compare sizes
+my $unit;
+my $better;
+my $worse;
+my $Greater;
+my $Lower;
+my $Dgreater;
+my $Dlower;
+my $regexp;
+my $exclude;
+my $output_a_mean = 0;
+my $output_sum = 0;
+my $output_g_mean = 0;
+my $min_ratio;
+my $max_ratio;
+my @files1;
+my @files2;
+my $header;
+my $text;
+my $factor1;
+my $factor2;
+my $invert;
+my $Xls;
+my $sep;
+my $delete;
+
+($me = $0) =~ s|.*/(.*)|$1|;
+
+# Default fields placement
+# unit key value
+my ($unit_idx, $key_idx, $value_idx) = (1,2,3);
+
+sub usage {
+ my $code = shift;
+ print STDERR <<EOM;
+Usage: $me [-r|-rdb] [-h|-help] file1 file2
+ -r|-rdb : RDB style output
+ -s|-rdb : Size expansion
+ -f|-field u:k:v : Position of unit,key,value fields default to [1:2:3]
+ -b|-better : Outputs only better results (ratio > 1)
+ -w|-worse : Outputs only worse results (ratio < 1)
+ -max <max_ratio>: Outputs only ratios lower than <max_ratio>
+ -min <min_ratio>: Outputs only ratios greater than <min_ratio>
+ -G|-Greater <value>: Outputs only values greater than <value>
+ -L|-Lower <value>: Outputs only values lower than <value>
+ -B|-Bigger <diff>: Outputs only diffs greater than <diff>
+ -S|-Smaller <diff>: Outputs only diffs lower than <diff>
+ -rx|-regexp /<regexp>/: Outputs only keys matching <regexp>
+ -ex|-exclude /<regexp>/: Don\'t outputs keys matching <regexp>
+ -gm: Outputs geometric mean
+ -am: Outputs arithmetic mean (default)
+ -sum: Outputs sum
+ -H|-Header: Outputs header
+ -T|-Text <text>: Outputs text as header
+ -F1 <f1>: Factor to apply to 1st value
+ -F2 <f2> : Factor to apply to 2nd value
+ -I : Invert values
+ -X : Xls format
+ -D /<regexp>/: field delimiter
+ -d/-delete <text> : remove <text> from the unit name
+ file1 : reference results
+ file2 : tested results
+EOM
+ exit $code;
+}
+
+sub to_percent {
+ my ($ratio) = @_;
+ my $p = int($ratio*100 + 0.5) - 100;
+ my $percent;
+ $percent = "+$p%" if $p >= 0;
+ $percent = "$p%" if $p < 0;
+ return $percent;
+}
+
+sub word_wrap {
+ my $word = shift;
+ my $width = shift;
+
+ if (defined($delete)) {
+ $word =~ s/$delete//;
+ }
+ return $word if $width >= length($word);
+
+ my $wrap = $width - 2;
+ my $dot = "..";
+ if ($width %2) {
+ $wrap--;
+ $dot .= ".";
+ }
+ $wrap /= 2;
+ return substr($word,0,$wrap) . $dot . substr($word,length($word) - $wrap,$wrap);
+}
+
+ Getopt::Long::config(qw(no_ignore_case));
+usage(1) unless GetOptions('r|rdb' => \$rdb,
+ 's|size' => \$size,
+ 'u|unit=s' => \$unit,
+ 'b|better' => \$better,
+ 'w|worse' => \$worse,
+ 'max=s' => \$max_ratio,
+ 'min=s' => \$min_ratio,
+ 'G|Greater=s' => \$Greater,
+ 'L|Lower=s' => \$Lower,
+ 'B|Bigger=s' => \$Dgreater,
+ 'S|Smaller=s' => \$Dlower,
+ 'rx|regexp=s' => \$regexp,
+ 'ex|exclude=s' => \$exclude,
+ 'H|Header' => \$header,
+ 'T|Text=s' => \$text,
+ 'gm' => \$output_g_mean,
+ 'am' => \$output_a_mean,
+ 'sum' => \$output_sum,
+ 'F1=s' => \$factor1,
+ 'F2=s' => \$factor2,
+ 'I' =>\$invert,
+ 'X' =>\$Xls,
+ 'D=s' =>\$sep,
+ 'd|delete=s' => \$delete,
+ 'f|fields=s' => sub { ($unit_idx, $key_idx, $value_idx) = split(':',$_[1]); },
+ 'h|help' => sub { usage(0); });
+
+if (scalar(@ARGV) == 2) {
+ $files1[0] = $ARGV[0];
+ $files2[0] = $ARGV[1];
+} else {
+ my $files2;
+ foreach my $arg (@ARGV) {
+ if ($arg eq "--") {
+ @files1 = @files2;
+ @files2 = ();
+ } else {
+ push @files2, $arg;
+ }
+ }
+}
+usage(1) if (scalar(@files1) == 0 || scalar(@files2) == 0);
+
+$max_ratio = 1 if !defined($max_ratio) && defined($worse);
+$min_ratio = 1 if !defined($min_ratio) && defined($better);
+
+eval "\$factor1 = $factor1" if defined($factor1);
+$factor1 = 1 if !defined($factor1);
+eval "\$factor2 = $factor2" if defined($factor2);
+$factor2 = 1 if !defined($factor2);
+
+if ($output_a_mean == 0 && $output_g_mean == 0 && $output_sum == 0) {
+ $output_sum = 1;
+ $output_a_mean = 1;
+ $output_g_mean = 1;
+}
+# matching unit
+my $munit = "cycles";
+$munit = "size" if $size;
+$munit = $unit if defined($unit);
+my @allunit = split(':', $munit);
+my %unit1;
+my %value1;
+
+my $def_sep = "/[ \t]+/";
+$def_sep = "/,/" if defined($Xls);
+$sep = $def_sep if !defined($sep);
+
+foreach my $file (@files1) {
+open (FILE1, "<$file") || die "can't open $file: $!";
+while (<FILE1>) {
+ next if (/^\s*\#/);
+ next if (/^--/);
+ next if /^$/;
+ my @fields;
+ @fields = eval "split($sep)";
+ my ($unit, $key, $value) = ($fields[$unit_idx-1], $fields[$key_idx-1], $fields[$value_idx-1]);
+ if (!defined($unit) || grep {($_ =~/\// && eval "\$unit =~ $_" ) || $_ eq $unit} @allunit) {
+ if (!(defined($exclude) && eval "\$key =~ $exclude")) {
+ if (!defined($regexp) || eval "\$key =~ $regexp") {
+ if (defined($Greater) && $value > $Greater ||
+ defined($Lower) && $value < $Lower ||
+ !defined($Greater) && !defined($Lower)) {
+ $value = "MISSING" if (!defined($value)|| $value eq "");
+ $value = "ZERO" if (defined($value) && $value eq "0");
+ if ($value =~ /^\D/) { # not numeric
+ $value1{$key} = $value;
+ } else {
+ $value = oct($value) if $value =~ /^0[^.]+$/;
+ $value1{$key} += $value;
+ }
+ $unit1{$key} += $unit;
+ }
+ }
+ }
+ }
+}
+close(FILE1);
+}
+
+my %unit2;
+my %value2;
+foreach my $file (@files2) {
+open (FILE2, "<$file") || die "can't open $file: $!";
+while (<FILE2>) {
+ next if (/^\s*\#/);
+ next if (/^--/);
+ next if /^$/;
+ my @fields;
+ @fields = eval "split($sep)";
+ my ($unit, $key, $value) = ($fields[$unit_idx-1], $fields[$key_idx-1], $fields[$value_idx-1]);
+ if (!defined($unit) || grep {($_ =~/\// && eval "\$unit =~ $_" ) || $_ eq $unit} @allunit) {
+ if (!defined($regexp) || eval "\$key =~ $regexp") {
+ if (defined($Greater) && $value > $Greater ||
+ defined($Lower) && $value < $Lower ||
+ !defined($Greater) && !defined($Lower)) {
+ $value = "MISSING" if (!defined($value) || $value eq "");
+ $value = "ZERO" if (defined($value) && $value eq "0");
+ if ($value =~ /^\D/) { # not numeric
+ $value2{$key} = $value;
+ } else {
+ $value = oct($value) if $value =~ /^0[^.]+$/;
+ $value2{$key} += $value;
+ }
+ $unit2{$key} += $unit;
+ }
+ }
+ }
+}
+close(FILE2);
+}
+if ($text) {
+ my @lines = split(/\\n/, $text);
+ for my $line (@lines) {
+ print $line . "\n";
+ }
+}
+
+if ($header) {
+ print "Unit : $munit\n";
+ print "Reference : @files1\n";
+ print "Test : @files2\n";
+}
+
+if ($rdb) {
+ if ($size) {
+ print <<EOL;
+Benchmark_ID Reference Test Expansion Percent
+22 8 8 8 8
+EOL
+} else {
+ print <<EOL;
+Benchmark_ID Reference Test Speedup Percent
+22 8 8 8 8
+EOL
+}
+} else {
+ if ($size) {
+print<<'END';
+Benchmark_ID Reference Test Expansion Percent
+-------------------------------------------------------------------------------
+END
+} else {
+print<<'END';
+Benchmark_ID Reference Test Speedup Percent
+-------------------------------------------------------------------------------
+END
+}
+}
+
+my $log;
+my ($key, $value1, $value2, $ratio, $percent);
+format =
+@<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>>>>> @>>>>>>>>>>>> @>>>>>>> @>>>>>>
+word_wrap($key,22), $value1, $value2, $ratio, $percent
+.
+
+my $count = 0;
+my $logsum1 = 0;
+my $logsum2 = 0;
+my $sum1 = 0;
+my $sum2 = 0;
+my $sumratio = 0;
+my $logsumratio = 0;
+foreach $key (sort keys %value1) {
+ $value1 = $value1{$key};
+ $value2 = $value2{$key};
+ next unless defined($value1) && defined($value2);
+ if ($value1 =~ /^\D/ || $value2 =~ /^\D/) {
+ $ratio = "";
+ $percent = "";
+ write;
+ } else {
+ my $exact_ratio;
+ my $diff = $value2 - $value1;
+ my $sign_differ = ($value1 >= 0) ^ ($value2 >= 0);
+ if ($size) {
+ if ($value1 == 0) {
+ if ($value2 == 0) {
+ $percent = $ratio = "nan";
+ } else {
+ $percent = $ratio = $sign_differ ? "-inf": "+inf";
+ }
+ } else {
+ if ($invert) {
+ $value1 = 1/$value1;
+ $value2 = 1/$value2;
+ }
+ $value1 *= $factor1;
+ $value2 *= $factor2;
+ $exact_ratio = $value2/$value1;
+ $ratio = int($exact_ratio*100 + 0.5)/100;
+ $percent = to_percent($exact_ratio);
+ }
+ } else {
+ if ($value2 == 0) {
+ if ($value1 == 0) {
+ $percent = $ratio = "nan";
+ } else {
+ $percent = $ratio = $sign_differ ? "-inf": "+inf";
+ }
+ } else {
+ if ($invert) {
+ $value1 = 1/$value1;
+ $value2 = 1/$value2;
+ }
+ $value1 *= $factor1;
+ $value2 *= $factor2;
+ $exact_ratio = $value1/$value2;
+ $ratio = int($exact_ratio*100 + 0.5)/100;
+ $percent = to_percent($exact_ratio);
+ }
+ }
+ if ($ratio ne "nan") {
+ if (defined($Dlower) && $diff < $Dlower ||
+ defined($Dgreater) && $diff > $Dgreater ||
+ !defined($Dlower) && !defined($Dgreater)) {
+ if ((!defined($min_ratio) ||
+ ($ratio ne "-inf" && $ratio > $min_ratio)) &&
+ (!defined($max_ratio) ||
+ ($ratio ne "+inf" && $ratio < $max_ratio))) {
+ $logsum1 += log($value1) if ($value1 != 0);
+ $logsum2 += log($value2) if ($value2 != 0);
+ $sum1 += $value1;
+ $sum2 += $value2;
+ $sumratio += $exact_ratio;
+ $logsumratio += log($exact_ratio) if ($exact_ratio != 0);
+ $count++;
+ write;
+ }
+ }
+ }
+ }
+}
+
+if (!$rdb) {
+print<<'END';
+-------------------------------------------------------------------------------
+END
+}
+
+if ($output_sum) {
+$key = "Sum ($count)";
+$value1 = int($sum1 + 0.5);
+$value2 = int($sum2 + 0.5);
+if ($count == 0) {
+ $ratio = "undef";
+ $percent = "undef";
+} else {
+ if ($size) {
+ $ratio = int($sum2/$sum1*100 + 0.5)/100;
+ $percent = to_percent($sum2/$sum1);
+ } else {
+ $ratio = int($sum2/$sum1*100 + 0.5)/100;
+ $percent = to_percent($sum2/$sum1);
+ }
+}
+write;
+
+if (!$rdb) {
+print<<'END';
+-------------------------------------------------------------------------------
+END
+}
+}
+
+if ($output_a_mean) {
+$key = "A.Mean ($count)";
+$value1 = "-";
+$value2 = "-";
+if ($count == 0) {
+ $ratio = "undef";
+ $percent = "undef";
+} else {
+ $ratio = int($sumratio/$count*100 + 0.5)/100;
+ $percent = to_percent($sumratio/$count);
+}
+write;
+
+if (!$rdb) {
+print<<'END';
+-------------------------------------------------------------------------------
+END
+}
+}
+
+if ($output_g_mean) {
+$key = "G.Mean 2 ($count)";
+$value1 = "-";
+$value2 = "-";
+if ($count == 0) {
+ $ratio = "undef";
+ $percent = "undef";
+} else {
+ $ratio = int(exp($logsumratio/$count)*100 + 0.5)/100;
+ $percent = to_percent(exp($logsumratio/$count));
+}
+write;
+
+if (!$rdb) {
+print<<'END';
+-------------------------------------------------------------------------------
+END
+}
+}