从perl 5.8(32bit)升级到5.16(64bit) - 正则表达式性能上升

sni*_*erd 3 regex windows perl performance activestate

我正在运行一系列针对数据块的正则表达式.我们最近从Activestate perl 5.8 32bit(我知道......非常老!)升级到perl 5.16 64bit.所有硬件保持不变(窗口).

我们注意到性能受到影响,因为我们的解析循环需要大约2.5秒,现在大约需要5秒.任何人都可以给我一个暗示会导致变化的提示吗?我期待性能的提高,因为我的理解是引擎有了很大的改进,任何关于我应该做的事情的文档都会非常感激.

amo*_*mon 7

是的,在v8之后,正则表达式引擎得到了很大的改进.在第10版中,我们看到:

  • 模式递归
  • 命名捕获
  • 占有量词
  • 回溯控制动词如(*FAIL)(*SKIP).
  • \K运营商
  • ......还有一些

此外,更多的内部设备使用Unicode识别.

在v12中,清除了Unicode支持.在\p\X运营商正则表达式现在大大增强.

在第14版中,Unicode支持被提升到6.0.\N运营商的Charnames得到了改进(参见charnamespragma).新的字符模型可以将任何无符号整数视为代码点.在正则表达式引擎中,

  • 正则表达式现在可以随身携带charclass将改性剂像/u,/d,/l,/a,/aa.
  • 实施了非破坏性的制裁/r.
  • RE引擎现在是可重入的,因此嵌入代码可以使用正则表达式.
  • \p 被清理干净了
  • 当需要切换到unicode语义时,正则表达式编译会更快.

在v16中,perl几乎支持Unicode 6.1.在正则表达式引擎中,

  • \p慈善机构的效率提高了.
  • 修复了各种正则表达式错误(通常涉及不区分大小写的匹配).

显然,并非所有这些功能都需要付出代价,但尤其是Unicode识别会使内部组件更复杂,速度更慢.

您也无法放弃一只手并声明脚本的执行时间从perl5 v8 x86翻倍至perl5 v16 x64; 变量太多了:

  • Perls是用相同的标志编译的吗?
    • perls线程perls(禁用线程支持使其更快)
    • 你的整数有多大?64位还是32位?
    • 选择了哪些编译器优化?
  • 你以前的Perl是否应用了一些特定于发行版的补丁?

基本上,你必须比较整个perl -V输出.


如果你使用正则表达式达到性能上限,它们可能是进行大量解析的错误工具.至少,您可以使用较新的功能来优化正则表达式,以消除一些回溯.

如果您解析代码描述了(大约)上下文无关语言(即你不使用(?{...}),(?=...)或相关正则表达式的功能),以及解析装置做这样的事情发生在树上,然后马尔巴:: R2可能会大大加快速度.