¿Por qué Perl compila diagnostics.pm si no tengo ningún diagnóstico en mi código?
devel-nytprof (1)
Cuando estaba viendo el resultado de Devel::NYTProf v4 para un programa CGI , encontré los diagnostics.pm
en el informe Archivos de código fuente, ordenados por hora exclusiva y luego por nombre .
Primero, no entendí por qué eso estaría en el código de producción. Profundicé en el informe y descubrí que fue llamado por main::BEGIN@17
. Esa, a su vez, es la siguiente línea:
# spent 34µs (26+8) within main::BEGIN@15 which was called: # once (26µs+8µs) by main::RUNTIME at line 15
use strict;
# spent 34µs making 1 call to main::BEGIN@15 # spent 8µs making 1 call to strict::import
# spent 36µs (17+19) within main::BEGIN@16 which was called: # once (17µs+19µs) by main::RUNTIME at line 16
use warnings;
# spent 36µs making 1 call to main::BEGIN@16 # spent 19µs making 1 call to warnings::import
# spent 292ms (171+121) within main::BEGIN@17 which was called: # once (171ms+121ms) by main::RUNTIME at line 17
no diagnostics;
# spent 292ms making 1 call to main::BEGIN@17
# spent 135µs (27+108) within main::BEGIN@18 which was called: # once (27µs+108µs) by main::RUNTIME at line 18
use Carp qw( carp croak );
Entonces este parece ser el culpable. Eliminé la línea de no diagnostics
y la llamada desapareció, ahorrando efectivamente unos 300 ms de tiempo.
Esto es lo que dice el use
perldoc sobre la palabra clave no
:
Hay una declaración de no correspondiente que desimporta los significados importados por el uso, es decir, llama a unimport Module LIST en lugar de importar. Se comporta del mismo modo que la importación con VERSIÓN, una LISTA omitida o vacía, o no se encuentra un método de no importación.
no integer; no strict ''refs''; no warnings;
Así que aquí está mi pregunta real: ¿estoy en lo cierto al suponer que si no llamo a no diagnostics
, en realidad se carga antes de que no se unimport
?
¿La llamada a no diagnostics
similar a esta pieza de código?
BEGIN {
require diagnostics.pm;
diagnostics->unimport;
}
En consecuencia, ¿es una mala idea simplemente desimportar cosas que nunca se han importado, porque eso realmente lo carga primero?
¿Estoy en lo correcto al asumir que si no llamo a
no diagnostics
, en realidad se carga antes de que no sea importado?
Sí. De hecho, es equivalente completo a
BEGIN {
require diagnostics;
diagnostics->unimport;
}
Entonces, no module
comando de no module
realmente carga y compila el módulo; incluyendo la ejecución del código que no está en ningún sub , en el bloque BEGIN, etc .; lo mismo para todas las dependencias de un módulo dado (para cada uso / requerimiento dentro).