ternary operator cond ? foo : bar being parsed as ?...?
[p5sagit/p5-mst-13.2.git] / lib / Benchmark.pm
index 0ca7c59..ad04a75 100644 (file)
@@ -412,6 +412,9 @@ All bugs found while writing a regression test.
 
 September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag.
 
+February, 2004; by Chia-liang Kao: make cmpthese and timestr use time
+statistics for children instead of parent when the style is 'nop'.
+
 =cut
 
 # evaluate something in a clean lexical environment
@@ -432,7 +435,7 @@ our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
              clearcache clearallcache disablecache enablecache);
 %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ;
 
-$VERSION = 1.051;
+$VERSION = 1.07;
 
 # --- ':hireswallclock' special handling
 
@@ -485,19 +488,39 @@ sub usage {
 # The cache needs two branches: 's' for strings and 'c' for code.  The
 # empty loop is different in these two cases.
 
-sub clearcache ($) {
+$_Usage{clearcache} = <<'USAGE';
+usage: clearcache($count);
+USAGE
+
+sub clearcache    { 
+    die usage unless @_ == 1;
     delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"}; 
 }
 
-sub clearallcache () { 
+$_Usage{clearallcache} = <<'USAGE';
+usage: clearallcache();
+USAGE
+
+sub clearallcache { 
+    die usage if @_;
     %Cache = (); 
 }
 
-sub enablecache () {
+$_Usage{enablecache} = <<'USAGE';
+usage: enablecache();
+USAGE
+
+sub enablecache   {
+    die usage if @_;
     $Do_Cache = 1; 
 }
 
-sub disablecache  () {
+$_Usage{disablecache} = <<'USAGE';
+usage: disablecache();
+USAGE
+
+sub disablecache  {
+    die usage if @_;
     $Do_Cache = 0; 
 }
 
@@ -574,7 +597,8 @@ sub timestr {
                            $r,$pu,$ps,$pt) if $style eq 'noc';
     $s=sprintf("$w wallclock secs (%$f cusr + %$f csys = %$f CPU)",
                            $r,$cu,$cs,$ct) if $style eq 'nop';
-    $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $pu + $ps )) if $n && $pu+$ps;
+    $s .= sprintf(" @ %$f/s (n=$n)", $n / ( $style eq 'nop' ? $cu + $cs : $pu + $ps ))
+       if $n && ($style eq 'nop' ? $cu+$cs : $pu+$ps);
     $s;
 }
 
@@ -624,7 +648,7 @@ sub runloop {
     # &runloop a lot, and thus reduce additive errors.
     my $tbase = Benchmark->new(0)->[1];
     while ( ( $t0 = Benchmark->new(0) )->[1] == $tbase ) {} ;
-    &$subref;
+    $subref->();
     $t1 = Benchmark->new($n);
     $td = &timediff($t1, $t0);
     timedebug("runloop:",$td);
@@ -862,7 +886,8 @@ sub cmpthese{
     for (@vals) {
        # The epsilon fudge here is to prevent div by 0.  Since clock
        # resolutions are much larger, it's below the noise floor.
-       my $rate = $_->[6] / ( $_->[2] + $_->[3] + 0.000000000000001 );
+       my $rate = $_->[6] / (( $style eq 'nop' ? $_->[4] + $_->[5]
+                                               : $_->[2] + $_->[3]) + 0.000000000000001 );
        $_->[7] = $rate;
     }
 
@@ -870,7 +895,7 @@ sub cmpthese{
     @vals = sort { $a->[7] <=> $b->[7] } @vals;
 
     # If more than half of the rates are greater than one...
-    my $display_as_rate = $vals[$#vals>>1]->[7] > 1;
+    my $display_as_rate = @vals ? ($vals[$#vals>>1]->[7] > 1) : 0;
 
     my @rows;
     my @col_widths;