Насколько это дорого: требуют "foo.pl"; - PullRequest
1 голос
/ 22 марта 2011

Я собираюсь переписать большую часть проекта, который я разработал за последние 10 лет, изучая Perl.Существует много возможностей для оптимизации.

Ключевой частью кода является большой блок if / elsif, для которого требуются файлы xxx.cgi в зависимости от значения POST.Например:

    if($FORM{'action'} eq "1"){require "1.cgi";}
elsif($FORM{'action'} eq "2"){require "2.cgi";}
elsif($FORM{'action'} eq "3"){require "3.cgi";}
elsif($FORM{'action'} eq "4"){require "4.cgi";}

У него гораздо больше раздражений, но насколько дорогое использование "require" в perl?

Ответы [ 5 ]

4 голосов
/ 22 марта 2011

require само по себе имеет относительно низкую стоимость в любом случае, и если вы require один и тот же файл более одного раза за один прогон вашей программы, он обнаружит, что файл уже был загружен и не будет пытатьсязагрузить его во второй раз.Однако, если у вас длинный и высоконаселенный путь поиска (@INC) и у вас require (или use) много файлов, вполне возможно, что все операции поиска в каталогах могут сложиться;это не распространено (и в вашем случае это не звучит правдоподобно), но его можно улучшить, реорганизовав каталоги модулей так, чтобы вещи, которые вы загружаете, появлялись раньше в @INC.

.Потенциально значительный удар по производительности, о котором говорилось в предыдущих ответах, - это стоимость компиляции кода в файлах, которые вы require.Избавление от require путем перемещения кода в основную программу не поможет в этом, так как код все равно нужно будет скомпилировать.В вашем случае это, вероятно, ухудшит ситуацию, поскольку приведет к тому, что код для всех опций будет скомпилирован для каждого, а не только для компиляции кода, используемого одним действием, выбранным пользователем.

3 голосов
/ 22 марта 2011

Как уже было сказано, это действительно зависит от реального кода в этих файлах. Лучше всего сделать тесты с использованием Devel :: NYTProf и / или Benchmark , чтобы увидеть, где больше всего времени тратится на ваш код, если вы недовольны его производительностью.

Вы также можете прочитать Профилирование Perl на perl.com , но оно немного устарело, так как использует Devel :: DProf .

1 голос
/ 22 марта 2011

Не отвечает на ваш основной вопрос, но все же хорошая идея для рефакторинга кода, который я недавно прочитал в блоге Ovid .

0 голосов
/ 22 марта 2011

Это будет зависеть от размера файлов, к которым вы обращаетесь. Если у вас есть массивные файлы CGI, это может ухудшить производительность вашего программного обеспечения. Если мы говорим 6 или 7 строк кода каждая, то нет проблем. Попробуйте сравнить производительность вашей программы с и без, и сделайте свое собственное суждение.

0 голосов
/ 22 марта 2011

Первый раз, возможно, дорого;Perl должен найти путь, чтобы найти файл и загрузить его.В последующее время это дешево - к таблице обращаются, и файл фактически не загружается во второй раз.Если это в CGI, который запускается один раз для каждого запроса, а затем завершается, то это не слишком хорошо.

...