Влияют ли комментарии на производительность Perl? - PullRequest
7 голосов
/ 06 ноября 2008

Я оптимизирую некоторые часто используемые коды Perl (один раз в день для каждого файла).

Замедляют ли комментарии скрипты на Perl? Мои эксперименты склоняются к нет:

use Benchmark;
timethese(20000000, {
    'comments' => '$b=1;
# comment  ... (100 times)
', 'nocomments' => '$b=1;'});

Дает почти одинаковые значения (кроме шума).

Benchmark: timing 10000000 iterations of comments, nocomments...
  comments:  1 wallclock secs ( 0.53 usr +  0.00 sys =  0.53 CPU) @ 18832391.71/s (n=10000000)
nocomments:  0 wallclock secs ( 0.44 usr +  0.00 sys =  0.44 CPU) @ 22935779.82/s (n=10000000)

Benchmark: timing 20000000 iterations of comments, nocomments...
  comments:  0 wallclock secs ( 0.86 usr + -0.01 sys =  0.84 CPU) @ 23696682.46/s (n=20000000)
nocomments:  1 wallclock secs ( 0.90 usr +  0.00 sys =  0.90 CPU) @ 22099447.51/s (n=20000000)

Я получаю аналогичные результаты, если запускаю комментарии и версии без комментариев как отдельные сценарии Perl.

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

Ответы [ 9 ]

18 голосов
/ 06 ноября 2008

Производительность во время выполнения? Нет.

Производительность парсинга и лексинга? Да, конечно.

Так как Perl имеет тенденцию анализировать и lex на лету, то комментарии будут влиять на производительность при запуске.

Будут ли они заметно влиять на это? Вряд ли.

13 голосов
/ 07 ноября 2008

Perl - это язык, скомпилированный как раз вовремя, поэтому комментарии и POD не влияют на производительность во время выполнения.

Комментарии и POD оказывают незначительное влияние на время компиляции, но они так легко и быстро разбираются в Perl, что практически невозможно измерить снижение производительности. Вы можете убедиться в этом сами, используя флаг -c, чтобы просто компилировать.

На моем Macbook Perl-программе с 2 инструкциями и 1000 строками комментариев по 70 символов требуется столько же времени, чтобы скомпилировать как одну с 1000 строками пустых комментариев, так и одну с двумя инструкциями печати. Обязательно запускайте каждый бенчмарк дважды , чтобы ваша ОС могла кэшировать файл, в противном случае вам нужно время для чтения файла с диска.

Если время запуска является проблемой для вас, это не из-за комментариев и POD.

8 голосов
/ 06 ноября 2008

Perl компилирует скрипт и затем выполняет его. Комментарии незначительно замедляют фазу компиляции, но не влияют на фазу запуска.

7 голосов
/ 06 ноября 2008

Perl не является языком сценариев в том же смысле, что и сценарии оболочки. Интерпретатор не читает файл построчно. Выполнение Perl-программы выполняется в два основных этапа: компиляция и время выполнения [1]. На этапе компиляции исходный код анализируется и преобразуется в байт-код. На этапе выполнения байт-код выполняется на виртуальной машине.

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

Вы используете Benchmark. Это хорошо! Вы должны искать способы улучшить алгоритм, а не микрооптимизацию. Devel :: DProf может быть полезен для поиска горячих точек. Вы абсолютно не должны отбрасывать комментарии в ошибочной попытке сделать вашу программу быстрее. Вы просто сделаете это неуправляемым.


[1] Это обычно называется компиляцией «как раз вовремя». Perl на самом деле имеет еще несколько стадий, таких как INIT и END, которые здесь не имеют значения.

3 голосов
/ 06 ноября 2008

Суть в том, чтобы оптимизировать узкие места. Чтение в файле состоит из:

  • открытие файла,
  • читает по содержанию,
  • закрытие файла,
  • разбор содержимого.

Из этих шагов чтение - самая быстрая часть (я не уверен насчет закрытия, это системный вызов, но вам не нужно ждать, пока он закончится). Даже если это 10% от всего (что, на мой взгляд, не так), то уменьшение его вдвое дает только 5% улучшенную производительность за счет отсутствия комментариев (что очень плохо). Для синтаксического анализатора удаление строки, начинающейся с #, не является ощутимым замедлением. И после этого комментарии исчезли, поэтому замедления быть не может.

Теперь представьте, что вы могли бы на самом деле улучшить часть «чтение в сценарии» на 5%, убрав все комментарии (что является действительно оптимистичной оценкой, см. Выше). Насколько велика доля «чтения в сценарии» в общем времени выполнения сценария? Конечно, зависит от того, сколько он делает, но поскольку perl-скрипты обычно читают как минимум еще один файл, это максимум 50%, но, поскольку perl-скрипты обычно делают что-то большее, честная оценка снизит это до некоторого диапазона. 1%. Таким образом, ожидаемое повышение эффективности за счет удаления всех комментариев составляет при наиболее (очень оптимистично) 2,5%, но на самом деле ближе к 0,05%. И затем, те, которые на самом деле дают более 1%, уже работают быстро, так как они почти ничего не делают, так что вы снова оптимизируете не в ту точку.

Заключение, оптимизация узких мест.

2 голосов
/ 07 ноября 2008

Модуль Benchmark в этом случае бесполезен. Он только измеряет время выполнения кода снова и снова. Поскольку ваш код на самом деле ничего не делает, большая часть его оптимизируется. Вот почему вы видите, что он работает 22 миллиона раз в секунду.

У меня есть почти на всю главу об этом в Мастеринг Perl . Погрешность измерения в методике Benchmark составляет около 7%. Ваши показатели соответствуют этим требованиям, так что разницы практически нет.

1 голос
/ 06 ноября 2008

Из комментария Пола Томблинса:

Разве Perl не выполняет компиляцию на лету? Может быть, комментарии отбрасывают рано? -

Да, Perl делает.

Это язык программирования между компилируемым и интерпретируемым. Код компилируется на лету, а затем запускается. комментарии обычно не имеют никакого значения. Максимум, на что это, вероятно, повлияет, - это то, что при первоначальном анализе файла строка за строкой и его предварительной компиляции вы можете увидеть нано-вторую разницу.

0 голосов
/ 06 ноября 2008

Замедляют ли Perl комментарии скрипт? Ну, разбор, да. Выполнение после анализа? Нет. Как часто анализируется скрипт? Только один раз, так что если у вас есть комментарий в цикле for, комментарий отбрасывается разбором один раз, до того, как сценарий даже запустится, как только он запустится, комментарий уже пропущен (и сценарий не сохраняется как сценарий внутри Perl), поэтому независимо от того, сколько раз повторяется цикл for, комментарий не будет влиять. Как быстро парсер может пропустить комментарии? То, как пишутся комментарии на Perl, очень быстро, поэтому я сомневаюсь, что вы заметите. Вы заметите более высокое время запуска, если у вас есть 5 строк кода и между каждой строкой по 1 млн строк комментариев ... но насколько вероятно, и с какой целью будет использоваться такой большой комментарий?

0 голосов
/ 06 ноября 2008

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

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

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