Как и где я могу узнать больше о оптимизаторе 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
здесь не показана.)