----- Original Message ----
> From: JJ Merelo <[email protected]>
> To: Lista de correo de Madrid Perl Mongers <[email protected]>
> 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
_______________________________________________
Madrid-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/madrid-pm

Responder a