Как и где я могу узнать больше об оптимизаторе Perl? - PullRequest
14 голосов
/ 02 ноября 2011

Мне интересно узнать больше о закулисной оптимизации, выполняемой Perl.

Например, оптимизатор рассматривает reverse sort { $a <=> $b } @array; как sort { $b <=> $a } @array;

Это выглядит хорошоol 'perldoc не имеет ничего по этому предмету .


Несколько вопросов здесь:

  1. В отсутствие perldoc, какой официальный ресурс можно узнать о таких оптимизациях?

  2. Существует ли причина, по которой perldoc не документирует эти оптимизации?

  3. Какие есть другие известные оптимизации?

Ответы [ 5 ]

9 голосов
/ 02 ноября 2011

Для подобных вещей вы можете найти фрагменты в документах (особенно те, которые касаются C api), но большинство из них находится в самом исходном коде C.

Для sort,Я считаю, что соответствующая функция S_simplify_sort в op.c

Ядро оптимизатора находится в Perl_peep в том же файле .

8 голосов
/ 02 ноября 2011

Некоторые из них описаны в perldeltas - любой, кто хочет узнать больше о том, как работает Perl, может получить некоторое понимание, прочитав их, начиная с perl5004delta, Некоторые из них достаточно хорошо прокомментированы в коде, и, конечно, RTFS - это еще один способ обучения. Хороший источник для мест, где можно начать поиск в источнике - это раздел «Скомпилированный код» perlguts , еще один документ, который стоит прочитать.

Некоторые из них, но далеко не все, описаны в главе 18 «Компиляция» Программирование на Perl (да, третьему изданию действительно 10 лет, и оно охватывает 5.6.0 и / или 5.6.1, но 4-е издание наконец готово!)

Однако многое из этого нигде не задокументировано, за исключением, возможно, потоков рассылки, где обсуждалась эта функция, пока она находилась в стадии разработки. Если вы заинтересованы в том, чтобы больше узнать о внутренностях Perl и, возможно, внести свой вклад в документацию, я бы предложил задать вопросы в списке рассылки perl5-porters или IRC-канале # p5p , так как именно здесь хранится большая часть перл-гутских познаний.

1 голос
/ 09 ноября 2011

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

В основном, хотя, как другие предполагают, лучше всего смотреть на источник и играть с соответствующими модулями B,идти.

1 голос
/ 09 ноября 2011

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

Следовательно, если вы используете собственный подпункт {} для поощрения обратной сортировки, это замедлится.

Мне также показалось, что я прочитал, что больше нет необходимости выполнять «обратную сортировку» - компилятор разберется за вас или, по крайней мере, обратит результат быстрее, чем использование пользовательского подпрограммы {}.

Эта старая статья «Свежий взгляд на эффективную сортировку Perl», похоже, совпадает с этими идеями:

http://www.sysarch.com/Perl/sort_paper.html

0 голосов
/ 12 ноября 2011

Модуль B::Deparse может дать что-то интересное:

$ perl -MO=Deparse -e 'reverse sort { $a <=> $b } @array'
reverse +(sort {$a <=> $b} @array);
-e syntax OK

(По какой-то причине оптимизация reverse здесь не отображается.)

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