Добавляет ли "use ...." вверху накладные расходы для сценария Perl? - PullRequest
8 голосов
/ 12 июня 2009

Я всегда удивлялся этому. У меня есть привычка всегда добавлять

use strict;
use warnings;
use Data::Dumper;

к началу каждого сценария, который я пишу. Добавляет ли это накладные расходы, если я даже не использую функцию Dumper? Кроме того, в большинстве случаев Data :: Dumper вызывался ранее в другом пакете, но он мне нужен в этом пакете, поэтому я включаю его снова. В этом случае это создает дополнительные издержки?

Ответы [ 6 ]

10 голосов
/ 12 июня 2009

Если у них есть BEGIN блоки или import подпрограммы, тогда да, это всегда добавляет накладные расходы. Кроме того, в конечном итоге будет выполнен любой основной код, и все блоки INIT, CHECK и END также будут выполнены.

Единственный способ, которым это не добавит накладных расходов, это если модуль ожидает, что use будет не более чем require. (Конечно, require также запускает все, кроме подпрограммы import, но именно поэтому я упомянул представление из модуля use -d. Он «ожидает» ничего, кроме простого require.)

Если вы по какой-то причине хотите сохранить эту строку, просто закомментируйте ее. В разработке вполне нормально иметь модули, которые вы не используете. В QA или производстве это ошибка, IMO.

9 голосов
/ 12 июня 2009

Perl должен проанализировать код в Dumper.pm, чтобы ваша программа запускалась медленнее. Это обычно очень тривиальный удар по производительности. Кроме того, любой код, не входящий в функции или функции импорта, будет работать. Это может оказать незначительное влияние на ваше время запуска. Вы также будете использовать больше памяти (AST для кода и любых структур данных, которые строит код). Это не лучшее, что вы можете сделать, но это далеко не худшее. Если ваши программы не выполняются очень часто (несколько раз в минуту), вы не должны заметить какого-либо реального улучшения скорости, удалив строку.

4 голосов
/ 12 июня 2009

Каждое использование требует времени до запуска вашего скрипта и, вероятно, увеличивает объем памяти скрипта. Чтобы проверить накладные расходы, вы можете запустить следующий скрипт:

 C:\Temp> cat zzz.pl
 #!/usr/bin/perl
 sleep 10;

 C:\Temp> timethis zzz.pl
 TimeThis :  Elapsed Time :  00:00:10.172

Объем памяти в диспетчере задач составил 2548 КБ.

Теперь добавьте

 use Data::Dumper;

и протестируйте снова:

 TimeThis :  Elapsed Time :  00:00:10.266

На этот раз объем памяти составил 3408K. Таким образом, вы тратите время и немного памяти, если используемый вами модуль на самом деле не используется.

Время запуска имеет значение в сценариях, которые вызываются неоднократно (например, CGI), а объем памяти имеет значение, среди прочего, в долго выполняющихся сценариях и сценариях.

1 голос
/ 13 июня 2009

Если вы спрашиваете, вы не против. Да, это добавляет некоторые накладные расходы. Код:

use Data::Dumper;

является почти точным эквивалентом:

BEGIN {
  require Data::Dumper;
  Data::Dumper->import();
}

Это означает, что во время компиляции модуль Data :: Dumper анализируется и выполняется тело, если это еще не сделано. Это означает, что если у вас много модулей и вы используете Data :: Dumper в каждом, это может произойти только один раз. Проверка уже выполненного запроса выполняется очень быстро, действительно очень быстро. Вторая строка вызывает импорт и устанавливает импорт в пространство имен текущего пакета (полученное вызывающей стороной). Это занимает некоторое время во всех модулях, где они используются. Если вы хотите избежать этого, используйте:

use Data::Dumper ();

Чем вы не можете позвонить Dumper(), но вы должны использовать Data::Dumper::Dumper(). Я предпочитаю использовать Data::Dumper->Dump([vars], [names]), который приносит мне результат, который мне нравится больше.

1 голос
/ 12 июня 2009

Это может быть важно, если ваш скрипт выполняется многократно и есть задержка или ограничение времени выполнения.

Например, если процесс разветвляется при каждом отображении веб-страницы, вы, вероятно, захотите минимизировать объем кода, который вы анализируете во время загрузки, удаляя неиспользуемые модули.

Или, если вы используете perl в правой части xargs.

Существуют и другие способы устранить эти издержки в ситуации с веб-сервером.

0 голосов
/ 18 июня 2009

Это не совсем то, что вы просили, но я полагаю, что использование Data :: Dumper - это опора и привычка, которую стоит бросить. Поскольку perl следует философии, предполагающей, что собирательный код является дружественным, а не злонамеренным, для программиста очень заманчиво использовать Data :: Dump непрозрачного объекта, чтобы выяснить, как хранятся его внутренние компоненты, а затем получить прямой доступ к этим внутренним объектам, а не использовать предоставленные интерфейсы. Data :: Dumper - одна из причин, по которой были созданы объекты Inside-Out - чтобы было трудно / невозможно для увлеченных, но нетерпеливых программистов суетиться через внутренности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...