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.
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. –