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