【发布时间】:2014-01-02 10:14:55
【问题描述】:
多年来,我一直在断断续续地研究 Perl 解析器,但由于它一直处于预 alpha 阶段,所以我从不担心加快它的速度。但是,我已经开始研究优化它的方法,并且对我的发现感到惊讶。
经过一些算法和正则表达式优化后,正常执行大约需要 3.5 秒,其中大约 2.3 秒是 Perl 启动所需的时间(我在放入“die”后用“time perl scriptname.pl”测量(“完成”);“在第一行)。我知道 Regexp::Grammars 不是目前最快的 Perl 模块,但它的初始化似乎比实际执行脚本花费的时间要长得多。
因此,我开始研究一种在运行之前将其编译为字节码的简单方法。似乎 B::Bytecode,唯一的功能性方法,不再维护或包含在主要的 Perl 发行版中。有什么简单的方法可以缩短启动时间?
谢谢!
【问题讨论】:
-
除了 Regexp::Grammars 之外,您的解析器还使用哪些模块?
-
在我的系统上编译 Regexp::Grammars 只需要 0.03 秒。可能是内部 Regexp::Grammars 结构的初始化在这里很慢,但在这种情况下编译为字节码无济于事(但可能是某种内部状态的序列化?)。
-
我的印象是 B::Bytecode 实际上让事情变得更慢
-
用
Devel::NYTProf分析执行,然后优化最慢的部分。不要在猜测上浪费你的时间(人类真的不擅长估计性能)。 -
谢谢阿蒙。我设法将其追溯到 Text::Balanced 中的一个调用,这似乎是由 Regexp::Grammars 内部调用的。
标签: perl bytecode regexp-grammars