Well, here's a benchmark. The first two are just normal factorial functions. The second two are factorial functions with a twist: a simple string gets created. Now, this string has to be created and saved on *every* recursive call, which should show the discrepancy a little more (as saving one little integer to the stack doesn't make much difference):
use strict;
use warnings 'all';
sub factorial_r {
my ($n) = @_;
return $n if ($n < 2);
return $n * factorial_r($n-1);
}
sub factorial_i {
my ($n) = @_;
my $i = $n - 1;
$n *= ($n - $i--) while $i > 1;
return $n;
}
sub factorial_r_extra {
my ($n) = @_;
my $x = "blah" x 100;
return $n if ($n < 2);
return $n * factorial_r_extra($n-1);
}
sub factorial_i_extra {
my ($n) = @_;
my $x = "blah" x 100;
my $i = $n - 1;
$n *= ($n - $i--) while $i > 1;
return $n;
}
use Benchmark qw(timethese);
timethese(100000, {
first => sub { factorial_r(50) },
second => sub { factorial_i(50) },
});
The results:
Benchmark: timing 100000 iterations of factorial_i, factorial_i_extra,
+ factorial_r, factorial_r_extra...
factorial_i: 5 wallclock secs ( 4.94 usr + 0.00 sys = 4.94 CPU) @ 2
+0251.11/s (n=100000)
factorial_i_extra: 6 wallclock secs ( 5.67 usr + 0.00 sys = 5.67 CP
+U) @ 17633.57/s (n=100000)
factorial_r: 6 wallclock secs ( 6.44 usr + 0.01 sys = 6.45 CPU) @ 1
+5496.67/s (n=100000)
factorial_r_extra: 13 wallclock secs (11.98 usr + 0.00 sys = 11.98 CP
+U) @ 8344.46/s (n=100000)
P.S. : I'm still young and armed with a job with flextime - I don't wake up until about 1pm, so this is like early afternoon for me. :)
|