diff options
Diffstat (limited to 'util/table.pl')
-rw-r--r-- | util/table.pl | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/util/table.pl b/util/table.pl new file mode 100644 index 0000000..b4e1ac8 --- /dev/null +++ b/util/table.pl @@ -0,0 +1,360 @@ +#! /usr/bin/perl +## +## vi:ts=4:et +## +##---------------------------------------------------------------------------## +## +## Author: +## Markus F.X.J. Oberhumer <markus@oberhumer.com> +## +## Description: +## Convert the output of the LZO lzotest program into a nice table. +## +## Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer +## +##---------------------------------------------------------------------------## + +$PROG = $0; +require 'ctime.pl'; + +# +# get options +# + +while ($_ = $ARGV[ $[ ], /^-/) { + shift(@ARGV); + /^--$/ && ($opt_last = 1, last); + + /^--sort=name/ && ($opt_sort_summary_by_name++, next); + /^--sort=ratio/ && ($opt_sort_summary_by_ratio++, next); + /^-s/ && ($opt_summary_only++, next); + /^-t/ && ($opt_clear_time++, next); +} + + +$alg = ''; +$sep = "+" . ("-" x 76) . "+\n"; + +$block_size = -1; + +$n = 0; +@algs = (); +%average = (); +%total = (); + +$lzo_version_string = ''; +$lzo_version_date = ''; + + +# /*********************************************************************** +# // +# ************************************************************************/ + +while (<>) { + + if (/(^|\s)(\d+)\s+block\-size/i) { + if ($block_size < 0) { + $block_size = $2; + &intro($block_size); + } elsif ($block_size != $2) { + die "$PROG: block-size: $block_size != $2\n"; + } + next; + } + + if (/^\s*LZO\s.*library\s+\(v\s*([\w\.\s]+)\s*\,\s*([^\)]+)\)/) { + $lzo_version_string = $1; + $lzo_version_date = $2; + next; + } + + if (/^\s*(\S+(\s+\[\S+\])?)\s*(\|.*\|)\s*$/i) { + if ($1 ne $alg) { + &footer($1); + &header($1); + } + $line = $3; + &stats(*line); + print "$line\n" if (!$opt_summary_only); + } +} +&footer($1); + +&summary(); + +exit(0); + + +# /*********************************************************************** +# // +# ************************************************************************/ + +sub stats { + local (*l) = @_; + local ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8); + + if ($l !~ /^\|\s*(.+?)\s+(\d+)\s+(\d+)\s+(\d+)\s+([\d\.]+\s+)?([\d\.]+\s+)?([\d\.]+)\s+([\d\.]+)\s*\|/) { + die $_; + } + + $n++; + + $x1 = $1; $x2 = $2; $x3 = $3; $x4 = $4; + $x5 = ($x2 > 0) ? $x4 * 100.0 / $x2 : 0.0; + $x6 = ($x2 > 0) ? $x4 * 8.0 / $x2 : 0.0; + $x7 = $7; $x8 = $8; + + # convert from kB/s to MB/s (for old versions of lzotest) + if ($x7 =~ /\.\d\d$/) { $x7 = $x7 / 1000.0; } + if ($x8 =~ /\.\d\d$/) { $x8 = $x8 / 1000.0; } + + if ($opt_clear_time) { + $x7 = $x8 = 0.0; + } + + $s[0] += $x2; + $s[1] += $x3; + $s[2] += $x4; + $s[3] += $x5; + $s[4] += $x6; + if ($x7 > 0) { + $s[5] += 1.0 / $x7; $sn[5] += 1; + } + if ($x8 > 0) { + $s[6] += 1.0/ $x8; $sn[6] += 1; + } + + $x1 =~ s/\s+$//; + $l = sprintf("| %-14s %10d %5d %9d %6.1f %5.2f %9.3f %9.3f |", + $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8); +} + + +# /*********************************************************************** +# // +# ************************************************************************/ + +sub header { + local ($t) = @_; + + $alg = $t; + + # reset stats + $n = 0; + @s = (0, 0, 0, 0.0, 0.0, 0.0, 0.0); + @sn = (0, 0, 0, 0, 0, 0, 0); + + return if $opt_summary_only; + + print "\n$alg\n\n"; + print $sep; +print <<EndOfString; +| File Name Length CxB ComLen Ratio% Bits Com MB/s Dec MB/s | +| --------- ------ --- ------ ----- ---- -------- -------- | +EndOfString +} + + +# /*********************************************************************** +# // +# ************************************************************************/ + +sub footer { + local ($t) = @_; + local ($shm5, $shm6); + + return unless $alg; + die if $n <= 0; + die if $s[0] <= 0; + + # harmonic mean + $shm5 = $s[5] > 0 ? $sn[5] / $s[5] : 0.0; + $shm6 = $s[6] > 0 ? $sn[6] / $s[6] : 0.0; + + push(@algs,$alg); + + $average{$alg} = + sprintf("| %-14s %10d %5d %9d %6.1f %5.2f %9.3f %9.3f |\n", + "Average", $s[0]/$n, $s[1]/$n, $s[2]/$n, + $s[3]/$n, $s[4]/$n, + $shm5, $shm6); + + $total{$alg} = + sprintf("| %-14s %10d %5d %9d %6.1f %5.2f %9.3f %9.3f |\n", + "Total", $s[0], $s[1], $s[2], + $s[2]/$s[0]*100, $s[2]/$s[0]*8, + $shm5, $shm6); + + return if $opt_summary_only; + + print $sep; + print $average{$alg}; + print $total{$alg}; + print $sep, "\n"; +} + + +# /*********************************************************************** +# // +# ************************************************************************/ + +$sort_mode = 0; + +sub cmp_by_ratio { + local ($aa, $bb); + + if ($sort_mode == 0) { + $aa = $average{$a}; + $bb = $average{$b}; + } elsif ($sort_mode == 1) { + $aa = $total{$a}; + $bb = $total{$b}; + } else { + die; + } + + ($aa =~ m%^\s*\|\s+\S+\s+\d+\s+\d+\s+\d+\s+(\S+)%) || die; + $aa = $1; + ($bb =~ m%^\s*\|\s+\S+\s+\d+\s+\d+\s+\d+\s+(\S+)%) || die; + $bb = $1; + + # $aa < $bb; + $aa cmp $bb; +} + + +# /*********************************************************************** +# // +# ************************************************************************/ + +sub summary { + local ($l); + local (@k); + + $sort_mode = 0; + if ($opt_sort_summary_by_name) { + @k = sort(@algs); + } elsif ($opt_sort_summary_by_ratio) { + @k = sort(cmp_by_ratio @algs); + } else { + @k = @algs; + } + + print "\n\n"; + print "Summary of average values\n\n"; + print $sep; +print <<EndOfString; +| Algorithm Length CxB ComLen Ratio% Bits Com MB/s Dec MB/s | +| --------- ------ --- ------ ----- ---- -------- -------- | +EndOfString + + for (@k) { + $l = $average{$_}; + $l =~ s/Average[\s]{7}/sprintf("%-14s",$_)/e; + print $l; + } + print $sep; + + + + $sort_mode = 1; + if ($opt_sort_summary_by_name) { + @k = sort(@algs); + } elsif ($opt_sort_summary_by_ratio) { + @k = sort(cmp_by_ratio @algs); + } else { + @k = @algs; + } + + print "\n\n"; + print "Summary of total values\n\n"; + print $sep; +print <<EndOfString; +| Algorithm Length CxB ComLen Ratio% Bits Com MB/s Dec MB/s | +| --------- ------ --- ------ ----- ---- -------- -------- | +EndOfString + + for (@k) { + $l = $total{$_}; + $l =~ s/Total[\s]{9}/sprintf("%-14s",$_)/e; + print $l; + } + print $sep; +} + + +# /*********************************************************************** +# // +# ************************************************************************/ + +sub intro { + local ($bs) = @_; + local ($v, $t, $x); + local ($u, $uname_m, $uname_s, $uname_r); + + $t = &ctime(time); chop($t); + $t = sprintf("%-55s |", $t); + + $v=''; + if ($lzo_version_string) { + $v = $lzo_version_string; + $v .= ', ' . $lzo_version_date if $lzo_version_date; + $v = sprintf("%-55s |", $v); + $v = sprintf("| LZO version : %s\n", $v); + } + + if ($bs % 1024 == 0) { + $x = sprintf("%d (= %d kB)", $bs, $bs / 1024); + } else { + $x = sprintf("%d (= %.3f kB)", $bs, $bs / 1024.0); + } + $x = sprintf("%-55s |", $x); + + $u=''; + if (1 == 1) { + $uname_s = `uname -s`; $uname_s =~ s/^\s+//; $uname_s =~ s/\s+$//; + $uname_r = `uname -r`; $uname_r =~ s/^\s+//; $uname_r =~ s/\s+$//; + $uname_m = `uname -m`; $uname_m =~ s/^\s+//; $uname_m =~ s/\s+$//; + if ($uname_s && $uname_m) { + $u = $uname_s; + $u .= ' ' . $uname_r if $uname_r; + $u .= ' ' . $uname_m; + $u = sprintf("%-55s |", $u); + $u = sprintf("| Operating system : %s\n", $u); + } + } + print <<EndOfString; + ++----------------------------------------------------------------------------+ +| DATA COMPRESSION TEST | +| ===================== | +| Time of run : $t +$v$u| Context length : $x ++----------------------------------------------------------------------------+ + + +Notes: +- CxB is the number of independent blocks a file was splitted +- MB/s is the speed measured in 1,000,000 uncompressed bytes per second +- all averages are calculated from the un-rounded values +- the average ratio & bits are calculated by the arithmetic mean +- the average speed is calculated by the harmonic mean + + +EndOfString +} + +__END__ + + +### insert something like this after 'Time of run': + +| Hardware : Intel Pentium 133, 64 MB RAM, 256 kB Cache | +| Operating system : MS-DOS 7.10, HIMEM.SYS 3.95, DOS/4GW 1.97 | +| Compiler : Watcom C32 10.5 | +| Compiler flags : -mf -5r -oneatx | +| Test suite : Calgary Corpus Suite | +| Files in suite : 14 | +| Timing accuracy : One part in 100 | + + |