[Madrid-pm] El tiempo irresistible de volver
Salvador Fandino
sfandino en yahoo.com
Dom Sep 26 11:12:59 PDT 2010
----- Original Message ----
> From: JJ Merelo <jjmerelo en gmail.com>
> To: Lista de correo de Madrid Perl Mongers <madrid-pm en pm.org>
> Sent: Sat, September 25, 2010 7:25:41 PM
> Subject: [Madrid-pm] El tiempo irresistible de volver
>
> Hola,
> Pasando profiler a algunos programillas me he dado cuenta que return
> $foo tarda bastante tiempo; el problema es que se mete en la pila el
> resultado de la última sentencia de una subrutina hagas lo que hagas,
¡No te fies del profiler!
Cuando sales de una subrutina, ademas de meter en la pila el valor a devolver,
el interprete libera variables temporales y ajusta las pilas.
Si haces un volcado del arbol que se crea al parsear una funcion simple...
perl -MO=Concise -e 'sub { return 1 }'
6 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 2 -e:1) v:{ ->3
5 <1> refgen vK/1 ->6
- <1> ex-list lKRM ->5
3 <0> pushmark sRM ->4
4 <$> anoncode[CV ] lRM ->5
-e syntax OK
... veras que hay un opcode "leave" que es el que se ejecuta al acabar la
subrutina y que es donde se realizan todas esas tareas de mantenimiento.
Si no me equivoco, el profiler no ve este opcode ya que no esta asignado a
ninguna linea de codigo, y por lo tanto su tiempo de ejecucion el profiler se lo
asigna al opcode anterior, que se corresponde al return (explicito o implicito).
- Salva
Más información sobre la lista de distribución Madrid-pm