2011-11-01 69 views
14

我想了解更多关于Perl执行的幕后优化的信息。如何以及在哪里可以了解更多关于Perl优化器的信息?

一个例子是优化治疗reverse sort { $a <=> $b } @array;sort { $b <=> $a } @array;

它看起来像好醇” perldocdoesn't have anything on this subject


几个问题在这里:

  1. 在没有perldoc,什么是了解这种优化的官方资源?

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

  3. 还有哪些其他常见的优化?

+0

不知道为什么,有没有关于这个问题的多文档,但由于编译器是开源的,你可以检查代码并亲自看到优化。 – Polynomial

+9

实现细节不属于perldoc,因为即使语言的基本行为不会改变,它们也可以更改。这些细节通常很有趣,但是perl文档已经太大了。 – mob

+1

我同意这样的事情可能会很好。正如暴徒所说,问题在于他们可能会改变。我知道另一个不错的优化是标量上下文中的'map'不会生成返回数组(这会被忽略)。这些东西很好理解,无需一路收集,至少对于常见的习惯用法和通用优化。 –

回答

9

对于这样的事情,您可能会发现文档中的小部分(尤其是那些处理C api的),但大部分都在C源代码本身。

对于sort,我相信相关的功能是S_simplify_sort in op.c

优化的核心是在Perl_peep in the same file。任何人想要了解更多有关Perl是如何运作可以通过阅读他们,从perl5004delta获得一些见解 -

8

一些它在perldeltas记录。其中一些在代码中有相当好的评论,当然RTFS是另一种学习方式。开始查看源代码的地方的一个很好的来源是the section "Compiled Code" of perlguts,另一个值得一读的文档。

第18章“编译”中记录了一些但并非全部的内容Programming Perl(是的,第3版确实是10岁,涵盖5.6.0和/或5.6.1,但是the 4th edition终于在工作!)

但是,它的很多,但是,除了可能的邮件列表线程正在讨论的功能,而它正在开发时记录。如果您有兴趣了解关于perl内部的更多信息,并且可能对文档有所贡献,我会建议您在perl5-porters mailing list#p5p IRC channel上提出问题,因为这是大部分perl-guts部落知识所在。

+0

当然,你也可以把你得到的任何答案都送回StackOverflow - 或者贿赂人们,直接在SO上发布它们:) – hobbs

+0

其实我想为这个问题提供一个奖励,以便那些与答案可以倒在他们的知识:) – Zaid

1

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

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

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

的“在高效Perl的排序重新审视”这个旧的文章似乎有这些想法同意:

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

+0

这并不回答这个大问题:我如何以及在哪里可以了解更多关于Perl优化器?它只是重申优化器用“反向排序”做的事情,并提供关于它的链接。 – Zaid

1

如果你能得到的副本保持,可以用的描述应对它比当前的Perl稍旧(尽管其中的大部分内容并没有多大变化),Extending and Embedding Perl这本书可能会有所帮助,它在内部,optrees和优化器的一些细节上都有章节。

尽管如其他人所建议的那样,查看源代码并使用适当的B模块进行播放是最好的方法。

0

B::Deparse模块可能会给一些有趣的事情:(出于某种原因,reverse优化没有在这里显示)

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

+0

这是一个问题,而不是答案 – Zaid

+0

对不起。我试图给出一个关于使用'B :: Deparse'模块作为学习perl优化器的一些方法的提示。 – tuomassalo

+0

那么如果'reverse'优化不在这里显示,我不确定'B:Deparse'对于这个问题的需求是多么有用 – Zaid

相关问题