Mientras repasaba el libro "Intermediate Perl", noté una sección sobre Transformaciones de Schwartz y probé el ejemplo en el ejercicio (9.9.2), pero me di cuenta de que varias ejecuciones daban como resultado que la transformación tomara más tiempo que el tipo normal. El código aquí realiza una especie simple de los archivos en el directorio windows \ system32 basa en el tamaño del archivo -¿Cuándo son útiles las transformaciones de Schwartz?
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
my $time = timethese(10, {
testA => sub { map $_->[0],
sort {$a->[1] <=> $b->[1]}
map [$_, -s $_],
glob "C:\\Windows\\System32\\*";
},
testB => sub { sort { -s $a <=> -s $b } glob "C:\\Windows\\System32\\*";
},
}
);
La salida es -
Benchmark: timing 10 iterations of testA, testB...
testA: 11 wallclock secs (1.89 usr + 8.38 sys = 10.27 CPU) @ 0.97/s (n=10)
testB: 5 wallclock secs (0.89 usr + 4.11 sys = 5.00 CPU) @ 2.00/s (n=10)
Mi entendimiento es que ya que la operación de archivo (-s) debe repetirse una y otra vez en el caso de testB, debe ejecutarse mucho más lento que testA. El resultado, sin embargo, se desvía de esa observación. ¿Que me estoy perdiendo aqui?
El problema era que el tipo devolvía un valor escalar como usted menciona. Cambiar eso solucionó el problema. ¿Podría verificar si la expresión del mapa es "incorrecta"? El manual indica que el mapa funciona como mapa BLOCK LIST // map EXPR, LIST. En mi caso, ambos funcionan bien. – aks
Pensé que las advertencias que recibí fueron desencadenadas por ese uso del mapa. Voy a revisar. – innaM
Tienes razón. Pero, ¿a dónde fueron esas advertencias? – innaM