Почему Perl компилирует Diagnostics.pm, если в моем коде нет диагностики?
Когда я посмотрел на вывод Devel:: NYTProf v4 для программы CGI, я наткнулся на diagnostics.pm
в отчете файлы исходного кода - упорядочены по эксклюзивному времени, затем по имени
Сначала я не понимал, почему это будет в рабочем коде. Я углубился в отчет и обнаружил, что он был вызван main::BEGIN@17
, Это, в свою очередь, следующая строка:
# 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 );
Так что это кажется виновником. Я удалил no diagnostics
линия, и звонок пропал, эффективно экономя около 300 мс времени.
Вот что пердок use
говорит о no
ключевое слово:
Существует соответствующая декларация no, которая не импортирует значения, импортированные при использовании, т. Е. Она вызывает unimport Module LIST вместо import. Он ведет себя так же, как импорт с VERSION, пропущенным или пустым LIST, или не найден метод unimport.
no integer; no strict 'refs'; no warnings;
Итак, вот мой актуальный вопрос: правильно ли я предполагаю, что если я позвоню no diagnostics
, это на самом деле загружается, прежде чем это unimport
ред?
Это вызов no diagnostics
похож на этот кусок кода?
BEGIN {
require diagnostics.pm;
diagnostics->unimport;
}
В результате, плохая идея - просто импортировать вещи, которые никогда не импортировались, потому что они действительно загружаются первыми?
1 ответ
Правильно ли я предположить, что если я позвоню
no diagnostics
, он на самом деле загружен, прежде чем он не импортируется?
Да. Это действительно полный эквивалент
BEGIN {
require diagnostics;
diagnostics->unimport;
}
Так no module
команда фактически загружает и компилирует модуль; включая выполнение кода, который не находится ни в одной подпрограмме, в блоке BEGIN и т. д.; То же самое для всех зависимостей данного модуля (для каждого использования/ требуется внутри).