home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lzo100.zip / lzo-1.00 / util / table.pl < prev    next >
Perl Script  |  1997-07-06  |  11KB  |  464 lines

  1. #! /usr/bin/perl
  2. ##
  3. ## vi:ts=4
  4. ##
  5. ##---------------------------------------------------------------------------##
  6. ##
  7. ##  Author:
  8. ##      Markus F.X.J. Oberhumer         markus.oberhumer@jk.uni-linz.ac.at
  9. ##
  10. ##  Description:
  11. ##      Convert the output of the LZO test program into a nice table.
  12. ##      Option '-b' will print the 'official' LZO benchmark.
  13. ##
  14. ##  Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
  15. ##  Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
  16. ##
  17. ##---------------------------------------------------------------------------##
  18.  
  19. $VERSION = '1.01.4';
  20. $PROG = $0;
  21.  
  22. require 'ctime.pl';
  23.  
  24. #
  25. # get options
  26. #
  27.  
  28. while ($_ = $ARGV[ $[ ], /^-/) {
  29.     shift(@ARGV);
  30.     /^--$/ && ($opt_last = 1, last);
  31.  
  32.     /^-D(.*)/ && ($opt_debug = $1 ? $1 : 1);
  33.     /^-b/ && $opt_bench++;
  34.     /^-n/ && $opt_sort_summary_by_name++;
  35.     /^-r/ && $opt_sort_summary_by_ratio++;
  36.     /^-t/ && $opt_clear_time++;
  37.     /^-f/ && $opt_force++;
  38. }
  39.  
  40.  
  41. $alg = '';
  42. $sep = "+" . ("-" x 72) . "+\n";
  43.  
  44. $block_size = -1;
  45.  
  46. $n = 0;
  47. @algs = ();
  48. %average = ();
  49. %total = ();
  50.  
  51. $bv_n = 0;
  52. @bv = (0, 0, 0.0, 0.0, 0.0);
  53. %bench = ();
  54. $bench_total = -1;
  55.  
  56. $lzo_version_string = '';
  57. $lzo_version_date = '';
  58.  
  59.  
  60. # benchmark reference values for 100.00
  61.  
  62. %bench_c = ('LZO1B-1',  1577.00,
  63.             'LZO1B-9',   590.50,
  64.             'LZO1C-1',  1532.50,
  65.             'LZO1C-9',   588.50,
  66.             'LZO1F-1',  1654.50,
  67.             'LZO1X-1',  1598.00 );
  68.  
  69. %bench_d = ('LZO1B-1',  4381.50,
  70.             'LZO1B-9',  4395.00,
  71.             'LZO1C-1',  4403.00,
  72.             'LZO1C-9',  4408.50,
  73.             'LZO1F-1',  4769.50,
  74.             'LZO1X-1',  4907.00 );
  75.  
  76.  
  77. # /***********************************************************************
  78. # //
  79. # ************************************************************************/
  80.  
  81. while (<>) {
  82.  
  83.     if (/(^|\s)(\d+)\s+block\-size/i) {
  84.         if ($block_size < 0) {
  85.             $block_size = $2;
  86.             &start($block_size);
  87.         } elsif ($block_size != $2) {
  88.             die "$PROG: block-size: $block_size != $2\n";
  89.         }
  90.         next;
  91.     }
  92.  
  93.     if (/execution\s+time.*\s+(\d+)\s/i) {
  94.         if ($bench_total < 0) {
  95.             $bench_total = $1;
  96.         } elsif ($bench_total != $1) {
  97.             die "$PROG: execution time: $bench_total != $1\n";
  98.         }
  99.         next;
  100.     }
  101.  
  102.     if (/^\s*LZO\s.*library\s+\(v\s*([\w\.\s]+)\s*\,\s*([^\)]+)\)/) {
  103.         $lzo_version_string = $1;
  104.         $lzo_version_date = $2;
  105.         next;
  106.     }
  107.  
  108.     if (/^\s*(\S+(\s+\[\S+\])?)\s*(\|.*\|)\s*$/i) {
  109.         if ($1 ne $alg) {
  110.             &footer($1);
  111.             &header($1);
  112.         }
  113.         $line = $3;
  114.         &stats(*line);
  115.         print "$line\n" unless $opt_bench;
  116.     }
  117. }
  118. &footer($1);
  119.  
  120. &bench() if $opt_bench;
  121. &summary() unless $opt_bench;
  122.  
  123. exit(0);
  124.  
  125.  
  126. # /***********************************************************************
  127. # //
  128. # ************************************************************************/
  129.  
  130. sub stats {
  131.     local (*l) = @_;
  132.     local ($x5, $x6, $x7, $x8);
  133.  
  134.     if ($l !~ /^\|\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+([\d\.]+\s+)?([\d\.]+\s+)?([\d\.]+)\s+([\d\.]+)\s*\|/) {
  135.         die $_;
  136.     }
  137.  
  138.     $n++;
  139.  
  140.     $x5 = ($2 > 0) ? $4 * 100.0 / $2 : 0.0;
  141.     $x6 = ($2 > 0) ? $4 *   8.0 / $2 : 0.0;
  142.  
  143.     $x7 = $7; $x8 = $8;
  144.     if ($opt_clear_time && !$opt_bench) {
  145.         $x7 = $x8 = 0.0;
  146.     }
  147.  
  148.     $s[0] += $2;
  149.     $s[1] += $3;
  150.     $s[2] += $4;
  151.     $s[3] += $x5;
  152.     $s[4] += $x6;
  153.     $s[5] += $x7;
  154.     $s[6] += $x8;
  155.  
  156.     $l = sprintf("| %-14s %8d %4d %8d %6.1f %5.2f %9.2f %9.2f |",
  157.                     $1, $2, $3, $4, $x5, $x6, $x7, $x8);
  158. }
  159.  
  160.  
  161. # /***********************************************************************
  162. # //
  163. # ************************************************************************/
  164.  
  165. sub header {
  166.     local ($t) = @_;
  167.  
  168.     $alg = $t;
  169.  
  170.     # reset stats
  171.     $n = 0;
  172.     @s = (0, 0, 0, 0.0, 0.0, 0.0, 0.0);
  173.  
  174.     return if $opt_bench;
  175.  
  176.     print "\n$alg\n\n";
  177.     print $sep;
  178. print <<Header;
  179. | File Name        Length  CxB   ComLen  %Remn  Bits   Com K/s   Dec K/s |
  180. | ---------        ------  ---   ------  -----  ----   -------   ------- |
  181. Header
  182. }
  183.  
  184.  
  185. # /***********************************************************************
  186. # //
  187. # ************************************************************************/
  188.  
  189. sub footer {
  190.     local ($t) = @_;
  191.     local ($bv);
  192.     local ($c, $d);
  193.  
  194.     return unless $alg;
  195.     die if $n <= 0;
  196.     die if $s[0] <= 0;
  197.  
  198.     push(@algs,$alg);
  199.  
  200.     $average{$alg} =
  201.         sprintf("| %-14s %8d %4d %8d %6.1f %5.2f %9.2f %9.2f |\n",
  202.             "Average", $s[0]/$n, $s[1]/$n, $s[2]/$n,
  203.             $s[3]/$n, $s[4]/$n,
  204.             $s[5]/$n, $s[6]/$n );
  205.  
  206.     $total{$alg} =
  207.         sprintf("| %-14s %8d %4d %8d %6.1f %5.2f %9.2f %9.2f |\n",
  208.             "Total", $s[0], $s[1], $s[2],
  209.             $s[2]/$s[0]*100, $s[2]/$s[0]*8,
  210.             $s[5]/$n, $s[6]/$n );
  211.  
  212.     if ($opt_bench) {
  213.  
  214.         $c = $bench_c{$alg};
  215.         $d = $bench_d{$alg};
  216.  
  217.         ($c > 0 && $d > 0) || die "$PROG: invalid benchmark algorithm $alg\n";
  218.         $n == 14 || die "$PROG: invalid benchmark suite\n";
  219.         $s[0] == 3141622 || die "$PROG: invalid benchmark length $s[0]\n";
  220.  
  221.         $bv = ((($s[5]/$c + $s[6]/$d) / $n) / 2.0) * 100.0;
  222.  
  223.         $bench{$alg} =
  224.             sprintf("| %-14s %10d %10d %10.2f %10.2f %11.2f |\n",
  225.                 "Benchmark", $s[0], $s[2],
  226.                 $s[5]/$n, $s[6]/$n , $bv);
  227.  
  228.         $bv_n++;
  229.         $bv[0] += $s[0];
  230.         $bv[1] += $s[2];
  231.         $bv[2] += $s[5]/$n;
  232.         $bv[3] += $s[6]/$n;
  233.         $bv[4] += $bv;
  234.  
  235.     } else {
  236.  
  237.         print $sep;
  238.         print $average{$alg};
  239.         print $total{$alg};
  240.         print $sep, "\n";
  241.     }
  242. }
  243.  
  244.  
  245. # /***********************************************************************
  246. # //
  247. # ************************************************************************/
  248.  
  249. $sort_mode = 0;
  250.  
  251. sub cmp_by_ratio {
  252.     local ($aa, $bb);
  253.  
  254.     if ($sort_mode == 0) {
  255.         $aa = $average{$a};
  256.         $bb = $average{$b};
  257.     } elsif ($sort_mode == 1) {
  258.         $aa = $total{$a};
  259.         $bb = $total{$b};
  260.     } else {
  261.         die;
  262.     }
  263.  
  264.     ($aa =~ m%^\s*\|\s+\S+\s+\d+\s+\d+\s+\d+\s+(\S+)%) || die;
  265.     $aa = $1;
  266.     ($bb =~ m%^\s*\|\s+\S+\s+\d+\s+\d+\s+\d+\s+(\S+)%) || die;
  267.     $bb = $1;
  268.  
  269.     # $aa < $bb;
  270.     $aa cmp $bb;
  271. }
  272.  
  273.  
  274. # /***********************************************************************
  275. # //
  276. # ************************************************************************/
  277.  
  278. sub bench {
  279.     local ($l);
  280.     local (@k);
  281.  
  282.     die if $bv_n <= 0;
  283.     die if $bv[0] <= 0;
  284.     if (!$opt_force) {
  285.         $bench_total >= 1200 || die "$PROG: benchmark execution time $bench_total is too short\n";
  286.     }
  287.  
  288.     @k = @algs;
  289.  
  290.     print $sep;
  291. print <<Bench;
  292. | Algorithm          Length     ComLen    Com K/s    Dec K/s   LZO bench |
  293. | ---------          ------     ------    -------    -------   --------- |
  294. Bench
  295.  
  296.     for (@k) {
  297.         $l = $bench{$_};
  298.         $l =~ s/Benchmark[\s]{5}/sprintf("%-14s",$_)/e;
  299.         print $l;
  300.     }
  301.     print $sep;
  302.     printf("| %-14s %10d %10d %-10s %-10s %11.2f |\n",
  303.         "OVERALL", $bv[0], $bv[1], "", "", $bv[4]/$bv_n);
  304.     print $sep;
  305. }
  306.  
  307.  
  308. # /***********************************************************************
  309. # //
  310. # ************************************************************************/
  311.  
  312. sub summary {
  313.     local ($l);
  314.     local (@k);
  315.  
  316.     $sort_mode = 0;
  317.     if ($opt_sort_summary_by_name) {
  318.         @k = sort(@algs);
  319.     } elsif ($opt_sort_summary_by_ratio) {
  320.         @k = sort(cmp_by_ratio @algs);
  321.     } else {
  322.         @k = @algs;
  323.     }
  324.  
  325.     print "\n\n";
  326.     print "Summary of average values\n\n";
  327.     print $sep;
  328. print <<Summary;
  329. | Algorithm        Length  CxB   ComLen  %Remn  Bits   Com K/s   Dec K/s |
  330. | ---------        ------  ---   ------  -----  ----   -------   ------- |
  331. Summary
  332.  
  333.     for (@k) {
  334.         $l = $average{$_};
  335.         $l =~ s/Average[\s]{7}/sprintf("%-14s",$_)/e;
  336.         print $l;
  337.     }
  338.     print $sep;
  339.  
  340.  
  341.  
  342.     $sort_mode = 1;
  343.     if ($opt_sort_summary_by_name) {
  344.         @k = sort(@algs);
  345.     } elsif ($opt_sort_summary_by_ratio) {
  346.         @k = sort(cmp_by_ratio @algs);
  347.     } else {
  348.         @k = @algs;
  349.     }
  350.  
  351.     print "\n\n";
  352.     print "Summary of total values\n\n";
  353.     print $sep;
  354. print <<Summary;
  355. | Algorithm        Length  CxB   ComLen  %Remn  Bits   Com K/s   Dec K/s |
  356. | ---------        ------  ---   ------  -----  ----   -------   ------- |
  357. Summary
  358.  
  359.     for (@k) {
  360.         $l = $total{$_};
  361.         $l =~ s/Total[\s]{9}/sprintf("%-14s",$_)/e;
  362.         print $l;
  363.     }
  364.     print $sep;
  365.  
  366.  
  367. print <<Summary;
  368.  
  369.  
  370. Notes:
  371. - CxB is the number of blocks
  372. - K/s is the speed measured in 1000 uncompressed bytes per second
  373. - all averages are calculated from the un-rounded values
  374.  
  375. Summary
  376. }
  377.  
  378.  
  379. # /***********************************************************************
  380. # //
  381. # ************************************************************************/
  382.  
  383. sub start {
  384.     local ($bs) = @_;
  385.     local ($v, $t, $x);
  386.     local ($u, $uname_m, $uname_s, $uname_r);
  387.  
  388.     $t = &ctime(time); chop($t);
  389.     $t = sprintf("%-51s |", $t);
  390.  
  391.     $v='';
  392.     if ($lzo_version_string) {
  393.         $v = $lzo_version_string;
  394.         $v .= ', ' . $lzo_version_date if $lzo_version_date;
  395.         $v = sprintf("%-51s |", $v);
  396.         $v = sprintf("| LZO version      : %s\n", $v);
  397.     }
  398.  
  399.     if ($bs % 1024 == 0) {
  400.         $x = sprintf("%d (= %d kB)", $bs, $bs / 1024);
  401.     } else {
  402.         $x = sprintf("%d (= %.3f kB)", $bs, $bs / 1024.0);
  403.     }
  404.     $x = sprintf("%-51s |", $x);
  405.  
  406.     $u='';
  407.     if (1 == 1) {
  408.         $uname_s = `uname -s`; $uname_s =~ s/^\s+//; $uname_s =~ s/\s+$//;
  409.         $uname_r = `uname -r`; $uname_r =~ s/^\s+//; $uname_r =~ s/\s+$//;
  410.         $uname_m = `uname -m`; $uname_m =~ s/^\s+//; $uname_m =~ s/\s+$//;
  411.         if ($uname_s && $uname_m) {
  412.             $u = $uname_s;
  413.             $u .= ' ' . $uname_r if $uname_r;
  414.             $u .= ' ' . $uname_m;
  415.             $u = sprintf("%-51s |", $u);
  416.             $u = sprintf("| Operating system : %s\n", $u);
  417.         }
  418.     }
  419.  
  420.     if ($opt_bench) {
  421.         print <<Start;
  422.  
  423. +------------------------------------------------------------------------+
  424. | LZO 'OFFICIAL' BENCHMARK                                               |
  425. | ========================                                               |
  426. | Time of run      : $t
  427. $v$u| Test suite       : Calgary Corpus Suite                                |
  428. | Files in suite   : 14                                                  |
  429. | Context length   : $x
  430. +------------------------------------------------------------------------+
  431.  
  432.  
  433. Start
  434.     } else {
  435.         print <<Start;
  436.  
  437. +------------------------------------------------------------------------+
  438. | DATA COMPRESSION TEST                                                  |
  439. | =====================                                                  |
  440. | Time of run      : $t
  441. $v$u| Context length   : $x
  442. | Timing accuracy  : One part in 100                                     |
  443. +------------------------------------------------------------------------+
  444.  
  445.  
  446. Start
  447.     }
  448. }
  449.  
  450. __END__
  451.  
  452.  
  453. ### insert something like this after 'Time of run':
  454.  
  455. | Hardware         : Intel 80486 DX2/66, 20 MB RAM, 256 kB Cache         |
  456. | Operating system : MSDOS 5.0                                           |
  457. | Memory manager   : QEMM 7.04, CWSDPMI 0.90+ (r3)                       |
  458. | Compiler         : djgpp v2 + gcc 2.7.2.1                              |
  459. | Compiler flags   : -O2 -fforce-addr -fomit-frame-pointer -m486         |
  460. | Test suite       : Calgary Corpus Suite                                |
  461. | Files in suite   : 14                                                  |
  462.  
  463.  
  464.