This is a live mirror of the Perl 5 development currently hosted at
Document eval vs. sub in Benchmark
authorHugo van der Sanden <>
Tue, 1 Apr 1997 22:31:55 +0000 (23:31 +0100)
committerChip Salzenberg <>
Tue, 1 Apr 1997 00:01:35 +0000 (12:01 +1200)
Subject: Re: Patch for

In <>, Tim Bunce writes:
:Simple: calling functions in perl is expensive.
Yeah, I simply hadn't expected it to be *that* expensive.

:> - ? "sub { package $pack; my(\$_i)=$n; while (\$_i--){&\$c;} }"
:> + ? "sub { package $pack; my(\$_i)=$n; while (\$_i--){&\$c();} }"
:It's cheaper to _not_ add () so I'd recommend leaving it off.
I considered that, but felt it was more correct not to pass through the
parameters that were received. My new patch ducks it, by shifting @_
out before it gets there.

I also looked at having two caches for empty string/empty sub timings,
but was unable to get satisfactory results. I'll come back to that one,
but I don't think it is urgent for 5.004.

This patch is for the in _96: it repeats stuff from my
previous patch, but avoids stuff that was obsoleted by other changes
in _96.



index a3c8544..67bdcd2 100644 (file)
@@ -176,6 +176,10 @@ for Exporter.
 =head1 CAVEATS
+Comparing eval'd strings with code references will give you
+inaccurate results: a code reference will show a slower
+execution time than the equivalent eval'd string.
 The real time timing is done using time(2) and
 the granularity is therefore only one second.
@@ -258,7 +262,7 @@ sub timestr {
     my($pt, $ct, $t) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a);
     $f = $defaultfmt unless defined $f;
     # format a time in the required style, other formats may be added here
-    $style = $defaultstyle unless defined $style;
+    $style ||= $defaultstyle;
     $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto';
     my $s = "@t $style"; # default for unknown style
     $s=sprintf("%2d secs (%$f usr %$f sys + %$f cusr %$f csys = %$f cpu)",
@@ -278,7 +282,7 @@ sub timedebug {
 # --- Functions implementing low-level support for timing loops
 sub runloop {
-    my($n, $c) = @_;
+    my($n, $c) = (shift, shift);
     $n+=0; # force numeric now, so garbage won't creep into the eval
     croak "negative loopcount $n" if $n<0;