我正在针对数据块运行一系列正则表达式。我们最近从 Activestate perl 5.8 32bit(我知道......非常老!)升级到 perl 5.16 64bit。所有硬件都保持不变(Windows)。
我们注意到性能下降,之前我们的解析循环需要大约 2.5 秒,现在大约需要 5 秒。谁能给我一个提示,说明什么会导致这种变化?我期待性能的提高,因为我的理解是引擎已经有了很大的改进,任何关于我应该做的不同的文档将不胜感激。
我正在针对数据块运行一系列正则表达式。我们最近从 Activestate perl 5.8 32bit(我知道......非常老!)升级到 perl 5.16 64bit。所有硬件都保持不变(Windows)。
我们注意到性能下降,之前我们的解析循环需要大约 2.5 秒,现在大约需要 5 秒。谁能给我一个提示,说明什么会导致这种变化?我期待性能的提高,因为我的理解是引擎已经有了很大的改进,任何关于我应该做的不同的文档将不胜感激。
是的,正则表达式引擎在 v8 之后有了很大的改进。单独在 v10 中,我们看到:
(*FAIL)
or (*SKIP)
。\K
商此外,更多的内部实现了 Unicode 感知。
在 v12 中,清理了 Unicode 支持。正则表达式中的\p
and\X
运算符现在得到了极大的增强。
在 v14 中,Unicode 支持被提升到 6.0。运算符的字符\N
名得到了改进(另见charnames
pragma)。新的字符模型可以将任何无符号整数视为代码点。在正则表达式引擎中,
/u
, /d
, /l
, /a
, /aa
./r
。\p
被清理了在 v16 中,perl 几乎支持 Unicode 6.1。在正则表达式引擎中,
\p
charclasses 的效率。显然,并非所有这些功能都是有代价的,但尤其是 Unicode 感知使内部更复杂、更慢。
您也不能放弃并声明脚本的执行时间从 perl5 v8 x86 到 perl5 v16 x64 增加了一倍;变量太多:
基本上,您必须比较整个perl -V
输出。
如果您使用正则表达式达到性能上限,那么它们可能是用于广泛解析的错误工具。至少,您可以使用更新的功能来优化正则表达式以消除一些回溯。
如果您的解析代码描述了(大致)上下文无关语言(即您不使用(?{...})
或(?=...)
相关的正则表达式功能),并且解析意味着执行诸如生成树之类的操作,那么Marpa::R2可能会大大加快速度。
如果您正在寻找更好的性能,您可能还需要确保正则表达式是您想要的。您没有指定您的系统正在使用哪种正则表达式,但通常您可以用内置函数替换正则表达式。
例子:
if (lc($name) eq 'bob') { $bob_count++ } #Faster
if ($name =~ /^bob$/i) { $bob_count++ } #Slower
my $sentiment = "I don't like beans.";
substr($sentiment, 13, 5) = 'broccoli'; #Faster
$sentiment = "I don't like beans.";
$sentiment =~ s/beans/broccoli/; #Slower
这些示例以及unpack
和index
可能不适用于您的代码,但如果适用,您应该对它们进行基准测试,看看它是否有助于提高性能。