[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