perl devel-nytprof

¿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).