我如何以及在哪里可以了解有关Perl优化器的更多信息?

时间:2011-11-01 20:13:39

标签: perl

我有兴趣了解更多有关Perl执行的幕后优化的信息。

示例是优化程序将reverse sort { $a <=> $b } @array;视为sort { $b <=> $a } @array;

的示例

看起来很棒'perldoc doesn't have anything on this subject


这里有几个问题:

  1. 在没有perldoc的情况下,了解此类优化的官方资源是什么?

  2. perldoc没有记录这些优化的原因吗?

  3. 还有哪些其他众所周知的优化?

5 个答案:

答案 0 :(得分:9)

对于这样的事情,您可能会在文档中找到点点滴滴(特别是那些处理C api的文档),但大部分内容都在C源代码本身中。

对于sort,我认为相关功能是S_simplify_sort in op.c

优化程序的核心位于Perl_peep in the same file

答案 1 :(得分:8)

perldeltas中记录了一些 - 任何想要了解Perl操作方式的人都可以通过阅读它来获得一些见解,从perl5004delta开始。其中一些在代码中得到了相当好的评论,当然RTFS是另一种学习方式。开始查看源代码的地方的一个很好的来源是the section "Compiled Code" of perlguts,另一个值得阅读的文档。

Programming Perl的第18章“编译”中记录了一些,但绝不是全部(是的,第3版确实是10年,涵盖5.6.0和/或5.6。 1,但the 4th edition终于开始了!)

然而,很多内容都没有记录,除了可能的邮件列表线程,正在开发时正在讨论该功能。如果您有兴趣了解有关perl内部的更多内容并且可能对文档做出一些贡献,我建议您在perl5-porters mailing list#p5p IRC channel上提出问题,因为这是大多数perl-胆量部落知识驻留。

答案 2 :(得分:1)

我怀疑使用内置排序而没有任何比较子{}将是最快的。

因此,如果您使用自定义子{}来鼓励反向排序,则会减慢速度。

我还以为我已经读过“反向排序”不再需要花费 - 编译器会为你排序,或者至少比使用自定义子{}更快地反转结果。

这篇关于“重新审视高效Perl排序”的旧文章似乎与这些想法一致:

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

答案 3 :(得分:1)

如果您可以获取副本,并且可以处理比当前Perl略长的描述(虽然其中大部分内容没有太大变化),但本书Extending and Embedding Perl可能会有所帮助,它有关于内部,选择和优化器的一些细节的章节。

大多数情况下,正如其他人建议的那样,查看来源,并使用适当的B模块,是最好的方法。

答案 4 :(得分:0)

B::Deparse模块可能会提供一些有趣的内容:

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

(出于某种原因,此处未显示reverse优化。)