This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Benchmark: move elapsed time calc into method
authorDavid Mitchell <davem@iabyn.com>
Thu, 26 Nov 2015 13:51:29 +0000 (13:51 +0000)
committerDavid Mitchell <davem@iabyn.com>
Thu, 26 Nov 2015 16:04:54 +0000 (16:04 +0000)
A couple of places do basically the same set of summing various times()
fields within a Benchmark object, so make it into a private method.

lib/Benchmark.pm

index b301678..1d272a7 100644 (file)
@@ -482,7 +482,7 @@ our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
              clearcache clearallcache disablecache enablecache);
 %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ;
 
-$VERSION = 1.20;
+$VERSION = 1.21;
 
 # --- ':hireswallclock' special handling
 
@@ -585,6 +585,17 @@ sub cpu_a { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps+$cu+$cs ; }
 sub real  { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $r              ; }
 sub iters { $_[0]->[5] ; }
 
+# return the sum of various times: which ones depending on $style
+
+sub elapsed {
+    my ($self, $style) = @_;
+    $style = "" unless defined $style;
+
+    return $self->cpu_c if $style eq 'nop';
+    return $self->cpu_p if $style eq 'noc';
+    return $self->cpu_a;
+}
+
 
 $_Usage{timediff} = <<'USAGE';
 usage: $result_diff = timediff($result1, $result2);
@@ -647,11 +658,7 @@ 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';
-    my $elapsed = do {
-       if ($style eq 'nop') {$cu+$cs}
-       elsif ($style eq 'noc') {$pu+$ps}
-       else {$cu+$cs+$pu+$ps}
-    };
+    my $elapsed = $tr->elapsed($style);
     $s .= sprintf(" @ %$f/s (n=$n)",$n/($elapsed)) if $n && $elapsed;
     $s;
 }
@@ -973,13 +980,11 @@ sub cmpthese{
     my @vals = map{ [ $_, @{$results->{$_}} ] } keys %$results;
 
     for (@vals) {
+        # recreate the pre-flattened Benchmark object
+        my $tmp_bm = bless [ @{$_}[1..$#$_] ];
+       my $elapsed = $tmp_bm->elapsed($style);
        # The epsilon fudge here is to prevent div by 0.  Since clock
        # resolutions are much larger, it's below the noise floor.
-       my $elapsed = do {
-           if ($style eq 'nop') {$_->[4]+$_->[5]}
-           elsif ($style eq 'noc') {$_->[2]+$_->[3]}
-           else {$_->[2]+$_->[3]+$_->[4]+$_->[5]}
-       };
        my $rate = $_->[6]/(($elapsed)+0.000000000000001);
        $_->[7] = $rate;
     }