# caching previous answers use Memoize; memoize('Mfactorial'); memoize('Mfactorial2'); sub Mfactorial { my $num = shift; return 1 if $num == 0 or $num == 1; return $num * Mfactorial($num - 1); } sub Mfactorial2 { my $iLex = shift; return 1 unless $iLex > 1; my $result =1; while ($iLex > 1) { $result = $result * $iLex; $iLex--; } $result; } __DATA__ results: Benchmark: timing 1000000 iterations of Closure, Global, Lexical, Memo, Memo2... Closure: 25 wallclock secs (26.29 usr + 0.00 sys = 26.29 CPU) @ 38037.28/s (n=1000000) Global: 26 wallclock secs (26.41 usr + 0.00 sys = 26.41 CPU) @ 37864.45/s (n=1000000) Lexical: 28 wallclock secs (25.32 usr + 0.05 sys = 25.37 CPU) @ 39416.63/s (n=1000000) Memo: 16 wallclock secs (16.20 usr + 0.02 sys = 16.22 CPU) @ 61652.28/s (n=1000000) Memo2: 17 wallclock secs (16.13 usr + 0.03 sys = 16.16 CPU) @ 61881.19/s (n=1000000) Rate Global Closure Lexical Memo Memo2 Global 37864/s -- -0% -4% -39% -39% Closure 38037/s 0% -- -3% -38% -39% Lexical 39417/s 4% 4% -- -36% -36% Memo 61652/s 63% 62% 56% -- -0% Memo2 61881/s 63% 63% 57% 0% --