2010-11-02 12 views
8

Estoy leyendo Code Complete 2, y uno de los puntos mencionados es sobre la creación de subrutinas incluso para operaciones que parecen demasiado simples para tener sus propias subrutinas, y cómo eso puede ser útil.¿Cómo puedo alinear las subrutinas de Perl?

Sé que puedo inline functions in C and C++ utilizando la palabra clave inline. Pero nunca encontré una forma de subrutinas en línea en Perl.

¿Hay alguna manera de decirle al intérprete de Perl que debe alinear las llamadas a la subrutina (o por qué no)?

+0

Aún así debe seguir los consejos, incluso si las oportunidades para la creación de líneas pueden parecer más limitadas en Perl. –

Respuesta

21

Las subrutinas constantes, es decir, las subrutinas con un prototipo vacío y un valor de retorno constante, están en línea. Así es como el constant pragma define constantes:

sub five() { 5 } 

podría ser inline si se considera antes de su primer uso.

De lo contrario, Perl permite que las subrutinas se redefinan dinámicamente en tiempo de ejecución, por lo que la alineación no es adecuada.

Para subrutinas que siempre devuelven el mismo valor con las mismas entradas, puede usar memoization.

Chapter 13 of Programming Perl proporciona información sobre los pasos de optimización realizados por perl.

Esto se denomina plegado constante. El plegado constante no se limita a casos simples como convertir 2 ** 10 en 1024 en el momento de la compilación. También resuelve las llamadas a funciones, tanto las incorporadas como las subrutinas declaradas por el usuario que cumplen los criterios de la sección "Incrustar funciones constantes" en el Capítulo 6, Subrutinas. Recordando el notorio conocimiento de los compiladores de FORTRAN sobre sus propias funciones intrínsecas, Perl también sabe cuál de sus propias incorporaciones para llamar durante la compilación. Es por eso que si intenta tomar el registro de 0.0 o el sqrt de una constante negativa, incurrirá en un error de compilación, no en un error de tiempo de ejecución, y el intérprete nunca se ejecutará.

Véase también perldoc perlguts.

Se puede ver el efecto de la constante de plegado a sí mismo:

#!/usr/bin/perl 

use strict; use warnings; 

sub log_ok() { 1 } 

if (log_ok) { 
    warn "log ok\n"; 
} 
perl -MO=Deparse t.pl

Salida:

sub log_ok() { 1 } 
use warnings; 
use strict 'refs'; 
do { 
    warn "log ok\n" 
}; 
t.pl syntax OK

Aquí, de constantes condujo a la sustitución del bloque if con un bloque do porque el compilador sabía que log_ok siempre devolvería un valor verdadero. Por otra parte, con:

#!/usr/bin/perl 

use strict; use warnings; 

sub log_ok() { 0.5 > rand } 

if (log_ok) { 
    warn "log ok\n"; 
} 

salida Deparse:

sub log_ok() { 
    use warnings; 
    use strict 'refs'; 
    0.5 > rand; 
} 
use warnings; 
use strict 'refs'; 
if (log_ok) { 
    warn "log ok\n"; 
} 
t.pl syntax OK

Un C compilador podría haber sustituido la if (log_ok) con if (0.5 > rand). perl no hace eso.

5

Perl solo permite alinear funciones constantes.De perldoc perlsub:

funciones con un prototipo de() son candidatos potenciales para procesos en línea. Si el resultado después de la optimización y plegado constante es una constante o un escalar-ámbito léxico que tiene hay otras referencias, entonces será utilizado en lugar de llamadas a funciones realizadas sin &.

3

No he probado ninguno de estos, pero si usted tiene el tiempo, usted podría intentar

  1. Macro
  2. macro
  3. o incluso Filter::Macro

Ellos' Todos los filtros de origen, por lo que deberá verificar el rendimiento de su inversión. La última tiene una opinión en cpanratings. (No haga caso de intento de Dan Dascalescu para regular el "espacio aéreo" módulo de Perl.)

- En realidad, el último Filter::Macro utiliza Filter::Simple::Compile (que a su vez utiliza Module::Compile) para compilar las rutinas, por lo que este podría realizar por encima de los otros métodos de filtro de fuente. Pero se aplica el standard caveats on source filters.

1

La velocidad no debería ser una consideración al escribir Perl. Adelante, haz que las cosas funcionen. Si el perfilado posterior muestra que está gastando mucho tiempo en una función simple debido a que lo llama mucho, entonces hágalo usted mismo.

+0

;) La optimización prematura es la raíz de todo mal - dijo Donald E. Knuth, y con razón. – Jinxed

Cuestiones relacionadas