X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FBenchmark.pm;h=2907e69c1cd17df5548b99a331d3927c8c869495;hb=93c87d9dc758ed6254c5eaa31718f40901b73ac0;hp=3f8eb62d0772972abaa47dbf68b20c151c74837c;hpb=f36484b00ee361eaebe87327215b5a06d9950de5;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Benchmark.pm b/lib/Benchmark.pm index 3f8eb62..2907e69 100644 --- a/lib/Benchmark.pm +++ b/lib/Benchmark.pm @@ -50,6 +50,9 @@ Benchmark - benchmark running times of Perl code $count = $t->iters ; print "$count loops of other code took:",timestr($t),"\n"; + # enable hires wallclock timing if possible + use Benchmark ':hireswallclock'; + =head1 DESCRIPTION The Benchmark module encapsulates a number of routines to help you @@ -196,7 +199,7 @@ Clear the cached time for COUNT rounds of the null loop. Clear all cached times. -=item cmpthese ( COUT, CODEHASHREF, [ STYLE ] ) +=item cmpthese ( COUNT, CODEHASHREF, [ STYLE ] ) =item cmpthese ( RESULTSHASHREF, [ STYLE ] ) @@ -273,6 +276,15 @@ for passing to timestr(). =back +=head2 :hireswallclock + +If the Time::HiRes module has been installed, you can specify the +special tag C<:hireswallclock> for Benchmark (if Time::HiRes is not +available, the tag will be silently ignored). This tag will cause the +wallclock time to be measured in microseconds, instead of integer +seconds. Note though that the speed computations are still conducted +in CPU time, not wallclock time. + =head1 NOTES The data is stored as a list of values from the time and times @@ -389,6 +401,14 @@ September, 1999; by Barrie Slaymaker: math fixes and accuracy and efficiency tweaks. Added cmpthese(). A result is now returned from timethese(). Exposed countit() (was runfor()). +December, 2001; by Nicholas Clark: make timestr() recognise the style 'none' +and return an empty string. If cmpthese is calling timethese, make it pass the +style in. (so that 'none' will suppress output). Make sub new dump its +debugging output to STDERR, to be consistent with everything else. +All bugs found while writing a regression test. + +September, 2002; by Jarkko Hietaniemi: add ':hireswallclock' special tag. + =cut # evaluate something in a clean lexical environment @@ -406,10 +426,32 @@ use Exporter; clearcache clearallcache disablecache enablecache); %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ; -$VERSION = 1.03; +$VERSION = 1.0501; + +# --- ':hireswallclock' special handling + +my $hirestime; + +sub mytime () { time } &init; +sub BEGIN { + if (eval 'require Time::HiRes') { + import Time::HiRes qw(time); + $hirestime = \&Time::HiRes::time; + } +} + +sub import { + my $class = shift; + if (grep { $_ eq ":hireswallclock" } @_) { + @_ = grep { $_ ne ":hireswallclock" } @_; + *mytime = $hirestime if defined $hirestime; + } + Benchmark->export_to_level(1, $class, @_); +} + sub init { $debug = 0; $min_count = 4; @@ -434,8 +476,8 @@ sub disablecache { $cache = 0; } # --- Functions to process the 'time' data type -sub new { my @t = (time, times, @_ == 2 ? $_[1] : 0); - print "new=@t\n" if $debug; +sub new { my @t = (mytime, times, @_ == 2 ? $_[1] : 0); + print STDERR "new=@t\n" if $debug; bless \@t; } sub cpu_p { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps ; } @@ -471,13 +513,15 @@ sub timestr { $f = $defaultfmt unless defined $f; # format a time in the required style, other formats may be added here $style ||= $defaultstyle; + return '' if $style eq 'none'; $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto'; my $s = "@t $style"; # default for unknown style - $s=sprintf("%2d wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)", + my $w = $hirestime ? "%2g" : "%2d"; + $s=sprintf("$w wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)", $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all'; - $s=sprintf("%2d wallclock secs (%$f usr + %$f sys = %$f CPU)", + $s=sprintf("$w wallclock secs (%$f usr + %$f sys = %$f CPU)", $r,$pu,$ps,$pt) if $style eq 'noc'; - $s=sprintf("%2d wallclock secs (%$f cusr + %$f csys = %$f CPU)", + $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; @@ -542,7 +586,7 @@ sub timeit { if ($cache && exists $cache{$cache_key} ) { $wn = $cache{$cache_key}; } else { - $wn = &runloop($n, ref( $code ) ? sub { undef } : '' ); + $wn = &runloop($n, ref( $code ) ? sub { } : '' ); # Can't let our baseline have any iterations, or they get subtracted # out of the result. $wn->[5] = 0; @@ -706,7 +750,9 @@ sub timethese{ } sub cmpthese{ - my ($results, $style) = ref $_[0] ? @_ : ( timethese( @_[0,1] ), $_[2] ) ; + my ($results, $style) = + ref $_ [0] ? @_ + : (timethese (@_ [0, 1], @_ > 2 ? $_ [2] : "none"), $_ [2]); $style = "" unless defined $style;