[Madrid-pm] El tiempo irresistible de volver

Joaquín Ferrero explorer en joaquinferrero.com
Dom Sep 26 12:18:37 PDT 2010


El 25/09/10 19:25, JJ Merelo escribió:
> 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,
> con lo que consume bastante tiempo. No sé si pasarlo a un closure
> merecerá la pena, pero en todo caso, ¿hay alguna forma de evitar el
> return en una subrutina? ¿Quizás definiendo prototipos?
>
> Saludos
>

Una forma sería... no teniendo subrutinas... :)

Es decir... lo mismo que se hace con las funciones inline en C <http://www.greenend.org.uk/rjk/2003/03/inline.html>

En Perl, sí que hay una manera de indicar que queremos que una función sea 'inline', usando prototipos. Pero no podremos 
hacer con todas las funciones...

http://perldoc.perl.org/perlsub.html#Constant-Functions

Functions with a prototype of () are potential candidates for inlining. If the result after optimization and constant 
folding is either a constant or a lexically-scoped scalar which has no other references, then it will be used in place 
of function calls made without & . Calls made using & are never inlined. (See constant.pm for an easy way to declare 
most constants.)

O a mano...

Tendrías que hacer que el código tuviese un constructor de código, que sustituyera cada aparición de la subrutina en el 
flujo principal del programa, por el código de la propia subrutina, y luego, hacer un eval() del código generado.

En buena parte de los casos, sería suficiente con meter el código dentro de un nuevo contexto ({ }), y añadiendo al 
principio una forma de asignar los argumentos que queramos pasar a la subrutina.


-- 
JF^D


Más información sobre la lista de distribución Madrid-pm