/ test-tools / lesec-analyse-speed-result
lesec-analyse-speed-result
  1  #! /usr/bin/perl
  2  
  3  use strict;
  4  use warnings;
  5  
  6  my $debug = defined $ENV{RLDEBUG};
  7  
  8  my %analysis = ();
  9  my $order = 0;
 10  
 11  while (<STDIN>) {
 12      if (m|
 13                  Doing
 14                  (?: \s+ (?<inputsize>\d+) \s+ bits)?
 15                  \s+ (?<algo>[-A-Za-z0-9]+)
 16                  \s+ (?<op>\w+) \s+ ops
 17                  \s+ for \s+ (?<seconds>\d+)s
 18                  (?:\s+ on \s+ (?<blocksize>\d+) \s+ byte \s+ blocks)?
 19                  (?:\s+ with \s+ (?<keysize>\d+) \s+ bit \s+ key)?
 20                  :
 21                  \s+ (?<numops>\d+) \s+ ops
 22                  \s+ in \s+ (?<time>\d+\.\d+)s
 23           |x) {
 24          my $row = $+{algo};
 25          $row .= sprintf(" %5d bits", $+{inputsize}) if $+{inputsize};
 26          $row .= sprintf(" <keysize=%d>", $+{keysize}) if $+{keysize};
 27  
 28          # Use an order number to ensure algorithms and rows are ordered
 29          # like they come from the input.
 30          $analysis{$+{algo}}->{order} //= ++$order;
 31          $analysis{$+{algo}}->{rows}->{$row} //= ++$order;
 32  
 33          if($+{blocksize}) {
 34              my $column = "bytes/s @ $+{blocksize}";
 35              $analysis{$+{algo}}->{columns}->{$column} = 1;
 36              $analysis{$+{algo}}->{data}->{"$row / $column"}
 37              = sprintf "%.2fk", ( 0.00 + $+{numops} ) * $+{blocksize} / $+{time} / 1000;
 38          } else {
 39              my $column1 = "s/$+{op}";
 40              my $column2 = "$+{op}/s";
 41              $analysis{$+{algo}}->{columns}->{$column1} = 1;
 42              $analysis{$+{algo}}->{data}->{"$row / $column1"}
 43              = sprintf "%f", ( 0.00 + $+{time} ) / $+{numops};
 44              $analysis{$+{algo}}->{columns}->{$column2} = 1;
 45              $analysis{$+{algo}}->{data}->{"$row / $column2"}
 46              = sprintf "%.1f", ( 0.00 + $+{numops} ) / $+{time};
 47          }
 48      }
 49  }
 50  
 51  my %sort_numbers = (
 52      # Relative positions for everything regarding known -assoc operations
 53      's/genkey'                  => -100,
 54      's/enc'                     => -90,
 55      's/dec'                     => -80,
 56      's/sign'                    => -70,
 57      's/verify'                  => -60,
 58      's/encap'                   => -50,
 59      's/decap'                   => -40,
 60  
 61      'genkey/s'                  => -10,
 62      'enc/s'                     => -9,
 63      'dec/s'                     => -8,
 64      'sign/s'                    => -7,
 65      'verify/s'                  => -6,
 66      'encap/s'                   => -5,
 67      'decap/s'                   => -4,
 68      'bytes/s @ (?<blocksize>\d+)' => sub { 0.0 + $+{blocksize} }
 69  );
 70  sub colsort {
 71      my $find_number = sub {
 72          my $column = shift;
 73          foreach my $k (keys %sort_numbers) {
 74              if ($column =~ m|^${k}$|) {
 75                  return
 76                      ref $sort_numbers{$k} eq 'CODE'
 77                      ? $sort_numbers{$k}->()
 78                      : $sort_numbers{$k};
 79              }
 80          }
 81          return undef;
 82      };
 83      my $a_n = $find_number->($a);
 84      my $b_n = $find_number->($b);
 85      print STDERR "DEBUG[colsort]: '$a' => $a_n\n" if $debug;
 86      print STDERR "DEBUG[colsort]: '$b' => $b_n\n" if $debug;
 87      return $a_n <=> $b_n;
 88  }
 89  
 90  sub algosort {
 91      $analysis{$a}->{order} <=> $analysis{$b}->{order}
 92  }
 93  
 94  sub rowsort {
 95      my $algo = shift @_;
 96      $analysis{$algo}->{rows}->{$a} <=> $analysis{$algo}->{rows}->{$b}
 97  }
 98  
 99  foreach my $algo (sort { algosort } keys %analysis) {
100      my @rows = ( sort { rowsort($algo) } keys %{$analysis{$algo}->{rows}} );
101      my @columns = ( "", sort { colsort } keys %{$analysis{$algo}->{columns}} );
102      my @column_max_size = ( map { length($_) } @columns );
103  
104      # Figure out sizes, so we get nicely aligned columns
105      foreach my $row (@rows) {
106          {
107              # column 0 is all about row names
108              my $data = $row;
109              if (length($data) > $column_max_size[0]) {
110                  $column_max_size[0] = length($data);
111              }
112          }
113          foreach my $i (1..$#columns) {
114              my $column = $columns[$i];
115              my $dataname = "$row / $column";
116              my $data = $analysis{$algo}->{data}->{$dataname} // "";
117              if (length($data) > $column_max_size[$i]) {
118                  $column_max_size[$i] = length($data);
119              }
120          }
121      }
122  
123      print "\n";
124  
125      # Print header line
126      foreach my $i (0..$#columns) {
127          my $minsize = $column_max_size[$i];
128          if ($i == 0) {
129              # Left adjusted
130              printf "%-${minsize}s", $columns[$i];
131          } else {
132              # Space, then right adjusted
133              printf "  %${minsize}s", $columns[$i];
134          }
135      }
136      print "\n";
137  
138      # Print the data line
139      foreach my $row (@rows) {
140          {
141              my $minsize = $column_max_size[0];
142              # Left adjusted
143              printf "%-${minsize}s", $row;
144          }
145          foreach my $i (1..$#columns) {
146              my $column = $columns[$i];
147              my $dataname = "$row / $column";
148              my $data = $analysis{$algo}->{data}->{$dataname} // "";
149              my $minsize = $column_max_size[$i];
150              # Space, then right adjusted
151              printf "  %${minsize}s", $data;
152          }
153          print "\n";
154      }
155  }