Как и где я могу узнать больше о оптимизаторе Perl?

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

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

Похоже, что хороший ol 'perldoc не имеет ничего на эту тему.


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

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

  • Есть ли причина, по которой perldoc не документирует эти оптимизации?

  • Какие еще общеизвестные оптимизации существуют?

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Я также подумал, что я прочитал, что больше нет затрат на выполнение "обратного сортирования" - компилятор сортирует его для вас или, по крайней мере, реверсирует результат быстрее, чем использование пользовательского sub {}.

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

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

Ответ 4

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

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

Ответ 5

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

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

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