[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