$ cat -n ./memoize.pl 1 #!/usr/bin/perl -w 2 use Benchmark; 3 4 sub fib { 5 my $n = shift; 6 if ($n < 2) { $n } 7 else { fib($n-1)+fib($n-2) } 8 } 9 10 { 11 12 my @fib = (0, 1); 13 14 sub fibm { 15 my $n = shift; 16 17 return $fib[$n] if defined $fib[$n]; 18 $fib[$n] = fibm($n-1)+fibm($n-2); 19 } 20 } 21 22 timethese(2, { 23 recursivo => sub { &fib(30) }, 24 memoized => sub { &fibm(30) } 25 } 26 );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:
$ time ./memoize.pl Benchmark: timing 2 iterations of memoized, recursivo... memoized: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) recursivo: 5 wallclock secs ( 5.81 usr + 0.00 sys = 5.81 CPU) @ 0.34/s (n=2) (warning: too few iterations for a reliable count) real 0m5.894s user 0m5.880s sys 0m0.010s