【问题标题】:How and where can I learn more about the Perl optimizer?如何以及在哪里可以了解有关 Perl 优化器的更多信息?
【发布时间】:2011-11-01 20:13:38
【问题描述】:

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

一个例子是优化器将reverse sort { $a <=> $b } @array; 视为sort { $b <=> $a } @array;

看起来不错perldocdoesn't have anything on this subject


这里有几个问题:

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

  2. perldoc 没有记录这些优化是否有原因?

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

【问题讨论】:

  • 不知道为什么没有太多关于该主题的文档,但由于编译器是开源的,您可以直接查看代码并查看优化。
  • 实现细节不属于 perldoc,因为即使语言的底层行为没有改变,它们也会改变。这些细节通常很有趣,但 perl 文档已经太大了。
  • 我同意这样的事情可能会很好。正如暴民所说,问题在于它们可能会改变。我知道另一个不错的优化是 map 在标量上下文中不会生成返回数组(这将被忽略)。这些东西很高兴知道,而不必一路收集它们,至少对于常见的习惯用法和常见的优化。
  • @daxim :感谢您悬赏这个问题。我以前应该这样做的。

标签: perl


【解决方案1】:

对于这样的事情,您可能会在文档中找到一些零碎的东西(尤其是那些处理 C api 的文档),但大部分都在 C 源代码本身中。

对于sort,我相信相关函数是S_simplify_sort in op.c

优化器的核心在Perl_peep in the same file

【讨论】:

    【解决方案2】:

    其中一些记录在 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-guts 部落知识所在的地方.

    【讨论】:

    • 当然,你也可以将你对有趣问题的任何答案反馈到 StackOverflow 中——或者用答案贿赂人们开始直接在 SO 上发布它们:)
    • 其实我想为这个问题提供一个赏金,以便那些有答案的人可以倾注他们的知识:)
    【解决方案3】:

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

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

    我还认为我已经读过,执行“反向排序”不再需要成本 - 编译器会为您进行排序,或者至少比使用自定义 sub{} 更快地反转结果。

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

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

    【讨论】:

    • 这并没有回答一个大问题:如何以及在哪里可以了解有关 Perl 优化器的更多信息?它只是重申优化器对reverse sort 所做的事情并提供了一个链接。
    【解决方案4】:

    如果你能拿到一份副本,并且可以处理比当前 Perl 稍旧的描述(尽管其中大部分内容没有太大变化),这本书 Extending and Embedding Perl 可能会有所帮助,它有关于优化器的内部结构、optree 和一些细节。

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

    【讨论】:

      【解决方案5】:

      B::Deparse 模块可能会提供一些有趣的东西:

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

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

      【讨论】:

      • 这是一个问题,而不是一个答案
      • 对不起。我试图提示使用 B::Deparse 模块作为学习 perl 优化器的一种方式。
      • 好吧,如果这里没有显示 reverse 优化,我不确定 B:Deparse 对这个问题的需求有多大用处
      • 正如我所说,这种方法可能会带来一些有趣的东西。您的问题是关于 perl 的一般优化,而不仅仅是 reverse 的情况。此方法确实揭示了 一些 优化,以及由于非平凡原因(例如可能的运算符重载)而不会发生它们的情况。尝试perl -MO=Deparse -e 'print 1+2+$a'perl -MO=Deparse -e 'print $a+1+2' 获取一些简单的示例。
      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多