sni*_*erd 3 regex windows perl performance activestate
我正在运行一系列针对数据块的正则表达式.我们最近从Activestate perl 5.8 32bit(我知道......非常老!)升级到perl 5.16 64bit.所有硬件保持不变(窗口).
我们注意到性能受到影响,因为我们的解析循环需要大约2.5秒,现在大约需要5秒.任何人都可以给我一个暗示会导致变化的提示吗?我期待性能的提高,因为我的理解是引擎有了很大的改进,任何关于我应该做的事情的文档都会非常感激.
是的,在v8之后,正则表达式引擎得到了很大的改进.在第10版中,我们看到:
(*FAIL)或(*SKIP).\K运营商此外,更多的内部设备使用Unicode识别.
在v12中,清除了Unicode支持.在\p与\X运营商正则表达式现在大大增强.
在第14版中,Unicode支持被提升到6.0.\N运营商的Charnames得到了改进(参见charnamespragma).新的字符模型可以将任何无符号整数视为代码点.在正则表达式引擎中,
/u,/d,/l,/a,/aa./r.\p 被清理干净了在v16中,perl几乎支持Unicode 6.1.在正则表达式引擎中,
\p慈善机构的效率提高了.显然,并非所有这些功能都需要付出代价,但尤其是Unicode识别会使内部组件更复杂,速度更慢.
您也无法放弃一只手并声明脚本的执行时间从perl5 v8 x86翻倍至perl5 v16 x64; 变量太多了:
基本上,你必须比较整个perl -V输出.
如果你使用正则表达式达到性能上限,它们可能是进行大量解析的错误工具.至少,您可以使用较新的功能来优化正则表达式,以消除一些回溯.
如果您解析代码描述了(大约)上下文无关语言(即你不使用(?{...}),(?=...)或相关正则表达式的功能),以及解析装置做这样的事情发生在树上,然后马尔巴:: R2可能会大大加快速度.