| #! /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 | |
| |
| |