Regex 为什么Perl5.16.2中的regcomp比Perl5.8.8慢?
在这两个版本的perl(5.8.8和5.16.2)上运行以下脚本表明,使用正则表达式操作时,5.16.2比5.8.8慢。为什么会这样?还有,有什么办法可以让我加快速度吗Regex 为什么Perl5.16.2中的regcomp比Perl5.8.8慢?,regex,perl,Regex,Perl,在这两个版本的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$},
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
正则表达式引擎速度减慢的主要原因是错误修复。i、 e.做正确的事情比做错误的事情要慢。正则表达式引擎速度慢的主要原因是错误修复。i、 e.做正确的事情比做错误的事情要慢。我在我的机器上测试过你的程序好几次。每次跑步都有不同的时间,个体差异有时比版本之间的大多数差异更大 我认为版本之间的差异无关紧要。 顺便说一句,您的比较显示以下排名: 慢/慢/快/慢/慢/快 对于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);
}
现在您可以看到是否涉及正则表达式引擎(或立即离开)。我在我的机器上测试了您的程序好几次。每次跑步都有不同的时间,个体差异有时比版本之间的大多数差异更大 我认为版本之间的差异无关紧要。 顺便说一句,您的比较显示以下排名: 慢/慢/快/慢/慢/快 对于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);
}
现在,您可以看到是否涉及正则表达式引擎(或者立即离开)。我们讨论的是什么样的速度差?“我们已经用两个perl版本之间的时间差更新了这个问题。希望有帮助。如果您将
q{}
更改为qr{}
并将m{$regex}
更改为$regex
,是否会有所不同?(至少在支持它的版本中是这样。)它在5.16.2中没有,但在5.8.8中有。检查这个,然后。perl 5.16.2不可预编译吗?-codepad运行perl v5.8.0,而ideone运行5.16.2我们讨论的是什么样的速度差异?“我们用两个perl版本之间的时间差异更新了这个问题。希望有帮助。如果您将q{}
更改为qr{}
并将m{$regex}
更改为$regex
,是否会有所不同?(至少在支持它的版本中是这样。)它在5.16.2中没有,但在5.8.8中有。检查这个,然后。perl 5.16.2是否不可预编译?-codepad运行perl v5.8.0,而ideone运行5.16.2什么样的bug?听起来很有趣。有什么消息吗?Unicode/UTF8相关?(在这种情况下,像/a
这样的标志会有所不同吗?)?听起来很有趣。有什么消息吗?Unicode/UTF8相关?(在这种情况下,像/a
这样的标志会有所不同吗?)。