[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