Подтвердить что ты не робот

Почему Perl компилирует диагностику .pm, если у меня нет диагностики в моем коде?

Когда я смотрел вывод Devel::NYTProf v4 для Программа CGI, я столкнулся с diagnostics.pm в исходных файлах исходного кода, упорядоченных по эксклюзивному времени, затем имени.

diagnostics.pm

Сначала я не понял, почему это было бы в производственном коде. Я углубился в отчет и выяснил, что он был вызван main::[email protected]. Это, в свою очередь, следующая строка:

# spent 34µs (26+8) within main::[email protected] which was called: # once (26µs+8µs) by main::RUNTIME at line 15
use strict;
# spent 34µs making 1 call to main::[email protected] # spent 8µs making 1 call to strict::import

# spent 36µs (17+19) within main::[email protected] which was called: # once (17µs+19µs) by main::RUNTIME at line 16
use warnings;

# spent 36µs making 1 call to main::[email protected] # spent 19µs making 1 call to warnings::import

# spent 292ms (171+121) within main::[email protected] which was called: # once (171ms+121ms) by main::RUNTIME at line 17
no diagnostics;
# spent 292ms making 1 call to main::[email protected]

# spent 135µs (27+108) within main::[email protected] which was called: # once (27µs+108µs) by main::RUNTIME at line 18
use Carp qw( carp croak );

Так что это, кажется, преступник. Я удалил строку no diagnostics, и вызов был ушел, эффективно экономя около 300 мс времени.

Здесь perldoc use говорится о ключевом слове no:

Здесь есть соответствующее объявление, которое не объединяет значения импортируется с использованием, т.е. он вызывает unimport Module LIST вместо Импортировать. Он ведет себя так же, как импорт с помощью VERSION, опущен или пустой LIST или не найден метод unimport.

no integer;
no strict 'refs';
no warnings;

Итак, вот мой реальный вопрос: Правильно ли я предполагаю, что если я вызову no diagnostics, он будет загружен до того, как будет unimport ed?

Является ли вызов no diagnostics похожим на этот фрагмент кода?

BEGIN {
  require diagnostics.pm;
  diagnostics->unimport;
}

В результате, это плохая идея просто unimport материала, который никогда не был импортирован, потому что это на самом деле загружает его в первую очередь?

4b9b3361

Ответ 1

Правильно ли я предполагаю, что если я вызываю no diagnostics, он загружается до того, как он будет неимпортирован?

Да. Его действительно полный эквивалент

BEGIN {
  require diagnostics;
  diagnostics->unimport;
}

Команда no module действительно загружает и компилирует модуль; включая выполнение кода, который не находится в sub, в блоке BEGIN и т.д.; то же самое для всех зависимостей данного модуля (для каждого использования/ требуется внутри).