[Madrid-pm] El tiempo irresistible de volver
Salvador Fandino
sfandino en yahoo.com
Dom Sep 26 11:22:20 PDT 2010
----- Original Message ----
> From: Bruno <brunorc en gmail.com>
> To: Lista de correo de Madrid Perl Mongers <madrid-pm en pm.org>
> Sent: Sun, September 26, 2010 10:02:37 AM
> Subject: Re: [Madrid-pm] El tiempo irresistible de volver
>
> Hola
>
> 2010/9/26 JJ Merelo <jjmerelo en gmail.com>:
> > Sería cuestión de medirlo, pero creo que el problema es que el return
> > se toma su tiempo de todas formas, aunque no devuelvas nada, devuelvas
> > undef o lo que sea. He logrado mejorar tiempos cambiando subrutinas
> > por bloques que se le pasan a map, pero nada que se haga con una
> > subrutina hace que vaya más rápido.
>
> Yo recuerdo hacer una prueba con Benchmark como esto:
>
> a) el codigo
> b) el mismo codigo en el bloque
> c) el mismo codigo en la funcion
>
> No habia mucha diferencia entre b) y c), pues me parece que es la
> construccion/destruccion del scope que cuesta el tiempo.
>
> Pero si el codigo hace algo mas que solo poner el valor en una
> variable, o hacer una incrementacion, eso no vale mucho. Recientemente
> en uno de nuestros TechTalks en Booking tuvimos una presentacion sobre
> microoptimizacion. Algunos resultados son un poco contraintuitivos,
> pero lo que me gusta mas es que en 5.10 "map in void context" es mas
> rapido que foreach. YEAH! Y por ejemplo:
>
> $foo = 42 if $dupa;
>
> es mas rapido que:
>
> if ( $dupa ) {
> $foo = 42;
> }
>
> tambien, pagas el precio de tener un bloque.
El porque de eso se puede ver facilmente con B::Concise:
~$ perl -MO=Concise,-exec -e 'if ($foo) { $foo = 42 }'
1 <0> enter
2 <;> nextstate(main 3 -e:1) v:{
3 <#> gvsv[*foo] s
4 <|> and(other->5) vK/1
5 <0> enter v
6 <;> nextstate(main 1 -e:1) v:{
7 <$> const[IV 42] s
8 <#> gvsv[*foo] s
9 <2> sassign vKS/2
a <@> leave vKP
b <@> leave[1 ref] vKP/REFC
-e syntax OK
salva en leon:~$ perl -MO=Concise,-exec -e '$foo=42 if ($foo)'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <#> gvsv[*foo] s
4 <|> and(other->5) vK/1
5 <$> const[IV 42] s
6 <#> gvsv[*foo] s
7 <2> sassign vKS/2
8 <@> leave[1 ref] vKP/REFC
-e syntax OK
Hay por ahi una charla de Nicholas Clark en la que tambien explica como
optimizar el codigo perl donde cuenta todas estas cosas. Yo se la vi hacer en
Braga, pero creo que la ha repetido más veces.
- Salva
Más información sobre la lista de distribución Madrid-pm