El siguiente ejemplo memoiza la función que computa los números de Fibonacci:
lhp@nereida:~/Lperl/src$ cat -n memoize2.pl 1 #!/usr/bin/perl -w 2 use Benchmark; 3 use Memoize; 4 5 sub fib { 6 my $n = shift; 7 if ($n < 2) { $n } 8 else { fib($n-1)+fib($n-2) } 9 } 10 11 { 12 13 my @fib = (0, 1); 14 15 sub fibm { 16 my $n = shift; 17 18 return $fib[$n] if defined $fib[$n]; 19 $fib[$n] = fibm($n-1)+fibm($n-2); 20 } 21 } 22 23 sub fibM { 24 my $n = shift; 25 if ($n < 2) { $n } 26 else { fib($n-1)+fib($n-2) } 27 } 28 29 memoize 'fibM'; 30 31 my ($r, $m, $a); 32 timethese(2, { 33 recursivo => sub { $r = &fib(30) }, 34 memoized => sub { $m = &fibm(30) }, 35 automemoized => sub { $a = &fibM(30) } 36 } 37 ); 38 39 print "recursivo = $r, memoized = $m, automemoized = $a\n";Este es un ejemplo en el cuál es conveniente ocultar la cache e impedir posibles colisiones de la variable
@fib
con cualesquiera
otras variables que pudieran existir en el programa. La
solución es hacer una clausura (lıneas 10-20).
La ejecución muestra como la técnica mejora claramente el rendimiento:
lhp@nereida:~/Lperl/src$ memoize2.pl Benchmark: timing 2 iterations of automemoized, memoized, recursivo... automemoized: 3 wallclock secs ( 2.98 usr + 0.00 sys = 2.98 CPU) @ 0.67/s (n=2) (warning: too few iterations for a reliable count) memoized: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) recursivo: 6 wallclock secs ( 5.97 usr + 0.00 sys = 5.97 CPU) @ 0.34/s (n=2) (warning: too few iterations for a reliable count) recursivo = 832040, memoized = 832040, automemoized = 832040