New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[PATCH 5.005_61] Fix, Re: mixed benchmarks [Was: Speed of f(), $o->m(), etc. in 03,57,58,61] #569
Comments
From The RT System itselfOr, perhaps, just perhaps, it should DWIM. Here's a patch that - compares times from sub{...} tests to sub{} instead of to '', - fixes a bug in the linear interpolation responsible for - improves the accuracy of the time 0 sample, and - reduces the number of separate timings that are added together The problem is that subroutine overhead is big compared to fast It will make existing benchmark scripts crawl if they do use Here's the 'test suite' I used in the example runs: my @tests = ( for ( @tests ) { Here's the output of _61's Benchmark as run on the above tests: [barries@jester Benchmark]$ time perl -I /var/perls/perl5.005_61/lib ft -1 Here's the output of the patched version. The patched version takes longer [barries@jester Benchmark]$ time perl ft -1 - Barrie ############################################################### Inline Patch--- /var/perls/perl5.005_61/lib/Benchmark.pm Tue Jul 20 13:17:59 1999
+++ Benchmark.pm Thu Sep 16 23:23:51 1999
@@ -273,7 +273,9 @@
sub debug { $debug = ($_[1] != 0); }
-sub clearcache { delete $cache{$_[0]}; }
+# The cache needs two branches: 's' for strings and 'c' for code. The
+# emtpy loop is different in these two cases.
+sub clearcache { delete $cache{"$_[0]c"}; delete $cache{"$_[0]s"}; }
sub clearallcache { %cache = (); }
sub enablecache { $cache = 1; }
sub disablecache { $cache = 0; }
@@ -362,11 +364,18 @@
croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@;
print STDERR "runloop $n '$subcode'\n" if $debug;
- $t0 = Benchmark->new(0);
+ # Wait for the user timer to tick. This makes the error range more like -0.01, +0. If
+ # we don't wait, then it's more like -0.01, +0.01. This may not seem important, but it
+ # significantly reduces the chances of getting too low initial $n in the initial, 'find
+ # the minimum' loop in &runfor. This, in turn, can reduce the number of calls to
+ # &runloop a lot, and thus reduce additive errors.
+ my $tbase = Benchmark->new(0)->[1];
+ do {
+ $t0 = Benchmark->new(0);
+ } while ( $t0->[1] == $tbase ) ;
&$subref;
$t1 = Benchmark->new($n);
$td = &timediff($t1, $t0);
timedebug("runloop:",$td);
$td;
}
@@ -377,12 +386,12 @@
my($wn, $wc, $wd);
printf STDERR "timeit $n $code\n" if $debug;
- if ($cache && exists $cache{$n}) {
- $wn = $cache{$n};
+ my $cache_key = $n . ( ref( $code ) ? 'c' : 's' ) ;
+ if ($cache && exists $cache{$cache_key} ) {
+ $wn = $cache{$cache_key};
} else {
- $wn = &runloop($n, '');
- $cache{$n} = $wn;
+ $wn = &runloop($n, ref( $code ) ? sub {} : '' );
+ $cache{$cache_key} = $wn;
}
$wc = &runloop($n, $code);
@@ -414,24 +423,23 @@
my ($n, $td, $tc, $ntot, $rtot, $utot, $stot, $cutot, $cstot );
- # First find the minimum $n that gives a non-zero timing.
+ # First find the minimum $n that gives a significant timing.
my $nmin;
- for ($n = 1, $tc = 0; $tc <= 0; $n *= 2 ) {
+ for ($n = 1, $tc = 0; ; $n *= 2 ) {
$td = timeit($n, $code);
$tc = $td->[1] + $td->[2];
+ last if $tc > 0.1 ;
}
$nmin = $n;
my $ttot = 0;
my $tpra = 0.05 * $tmax; # Target/time practice.
# Double $n until we have think we have practiced enough.
- for ( $n = 1; $ttot < $tpra; $n *= 2 ) {
+ for ( ; $ttot < $tpra; $n *= 2 ) {
$td = timeit($n, $code);
- $tc = $td->cpu_p;
$ntot += $n;
$rtot += $td->[0];
$utot += $td->[1];
@@ -446,7 +454,7 @@
# Then iterate towards the $tmax.
while ( $ttot < $tmax ) {
$r = $tmax / $ttot - 1; # Linear approximation.
- $n = int( $r * $n );
+ $n = int( $r * $ntot );
$n = $nmin if $n < $nmin;
$td = timeit($n, $code);
$ntot += $n; |
@iabyn - Status changed from 'stalled' to 'resolved' |
Migrated from rt.perl.org#1421 (status was 'resolved')
Searchable as RT1421$
The text was updated successfully, but these errors were encountered: