use strict; use warnings; use Memoize; use Benchmark 'cmpthese'; sub fib1 { my $n = shift; return $n if $n < 2; return fib1($n-1) + fib1($n-2); } sub fib2 { my $n = shift; return $n if $n < 2; return fib2($n-1) + fib2($n-2); } memoize('fib2'); my %fib3_cache; sub fib3 { my $n = shift; return $fib3_cache{$n} ||= do { $n < 2 ? $n : fib3($n-1) + fib3($n-2) }; } for (0..5) { die "something bad" unless fib1($_)==fib2($_); die "something bad" unless fib1($_)==fib3($_); } cmpthese(-1, { fib1 => sub { fib1 20 }, fib2 => sub { fib2 20 }, fib3 => sub { fib3 20 }, }); __END__ Rate fib1 fib2 fib3 fib1 18.2/s -- -100% -100% fib2 37594/s 206668% -- -87% fib3 289129/s 1590107% 669% --