我有兴趣了解更多有关Perl执行的幕后优化的信息。
示例是优化程序将reverse sort { $a <=> $b } @array;
视为sort { $b <=> $a } @array;
看起来很棒'perldoc
doesn't have anything on this subject。
这里有几个问题:
在没有perldoc
的情况下,了解此类优化的官方资源是什么?
perldoc
没有记录这些优化的原因吗?
还有哪些其他众所周知的优化?
答案 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排序”的旧文章似乎与这些想法一致:
答案 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
优化。)