diff options
author | Christophe Lyon <christophe.lyon@linaro.org> | 2017-06-08 12:26:58 +0000 |
---|---|---|
committer | Christophe Lyon <christophe.lyon@linaro.org> | 2018-03-23 16:01:08 +0000 |
commit | c4db960bd9853f7758a386f892dac7c2fa8be49f (patch) | |
tree | d8817146d2d42f4c5b3aa96f9553c07b5ffa1a7f | |
parent | fbd99fd283390670ce311c27a05888c75f34e744 (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-x | compare.pl | 431 |
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 +} +} |