在这两个版本的perl(5.8.8和5.16.2)上运行以下脚本表明,使用正则表达式操作,5.16.2比5.8.8慢。为什么会这样 ?而且,有什么方法可以加快速度吗?
use Time::HiRes 'time';
for my $regex (
q{^a$|^b$},
q{^(a|b)$},
q{(a|b)},
q{^a$|^b$|^c$|^d$|^e$|^f$},
q{^(a|b|c|d|e|f)$},
q{a|b|c|d|e|f},
) {
my $start = time();
for my $i (1 .. 100_000) {
'SOMEBIGSTRINGHERE' =~ m{$regex};
}
my $runtime = time() - $start;
printf("%50s: %f\n", $regex, $runtime);
}
使用perl 5.8.8 -
^a$|^b$: 0.101017
^(a|b)$: 0.017527
(a|b): 0.107669
^a$|^b$|^c$|^d$|^e$|^f$: 0.163687
^(a|b|c|d|e|f)$: 0.022244
a|b|c|d|e|f: 0.171675
使用perl 5.16.2 -
^a$|^b$: 0.254984
^(a|b)$: 0.031507
(a|b): 0.045713
^a$|^b$|^c$|^d$|^e$|^f$: 0.443303
^(a|b|c|d|e|f)$: 0.031506
a|b|c|d|e|f: 0.043478
答案 0 :(得分:4)
正则表达式引擎减速的主要原因是错误修复。即正确地做事比做错做得慢。
答案 1 :(得分:0)
我在我的机器上多次测试你的程序。每次运行都有不同的时间,个体差异有时比大多数版本之间的差异大。
我称版本之间的差异无关紧要。 顺便说一句,您的比较显示以下排名:
慢/慢/的更快强> /慢/慢/的更快强>
表示5.16.2对比5.8.8
事实上,你几乎没有做过10万次。尝试:
use strict;
use warnings;
use Time::HiRes 'time';
my $str = 'SOMEBIGSTRINGHERE_ somebigstringhere ' x 10000;
for my $regex ( qr{^a$|^b$},
qr{^(a|b)$},
qr{(a|b)},
qr{^a$|^b$|^c$|^d$|^e$|^f$},
qr{^(a|b|c|d|e|f)$},
qr{a|b|c|d|e|f} ) {
my $start = time();
for my $i (1 .. 100) {
$str =~ /$regex/;
}
my $runtime = time() - $start;
printf("%50s: %f\n", $regex, $runtime);
}
现在您可以查看是否完全参与了正则表达式引擎(或立即离开)。