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) }, }); #### 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) @ 20251.11/s (n=100000) factorial_i_extra: 6 wallclock secs ( 5.67 usr + 0.00 sys = 5.67 CPU) @ 17633.57/s (n=100000) factorial_r: 6 wallclock secs ( 6.44 usr + 0.01 sys = 6.45 CPU) @ 15496.67/s (n=100000) factorial_r_extra: 13 wallclock secs (11.98 usr + 0.00 sys = 11.98 CPU) @ 8344.46/s (n=100000)