我如何评估哪个表达式更快:
grep($var eq $_, qw(abc ijk abcdef def))
OR
$var =~ /^abc|ijk|abcdef|def$/
修改:将正则表达式更正为:
$var =~ /^(?:abc|ijk|abcdef|def)$/
答案 0 :(得分:4)
首先,确保两个表达式在语义上等效(例如,对“qqqijkqqq”进行测试)。
使用Benchmark来比较速度:
#!/usr/bin/perl
use warnings;
use strict;
use Test::More;
use Benchmark qw{ cmpthese };
for my $var (qw(a abc ijk abcdef def qqqijkqqq)) {
is_deeply(!!G($var), !!R($var), "same $var");
}
done_testing();
sub G {
my $var = shift;
grep $var eq $_, qw(abc ijk abcdef def)
}
sub R {
my $var = shift;
$var =~ /^(?:abc|ijk|abcdef|def)$/
}
cmpthese(-3,
{ grep => 'G("abc")',
regex => 'R("abc")',
});
基准的输出:
Rate grep regex
grep 631585/s -- -23%
regex 824557/s 31% --
答案 1 :(得分:1)
首先你的正则表达式是错误的。将管道字放在()
内以使其正确。
^(?:abc|ijk|abcdef|def)$
^ ^
现在来吧。我没有找到任何关于此的文件。所以想出了我自己的代码来测试它。这是:
my $var = "abc";
## block 1
my $x = time();
for(1..10000000){
grep($var eq $_, qw(abc ijk abcdef def));
}
my $y = time();
print "grep: " . ($y- $x);
## block 2
$x = time();
for(1..10000000){
$var =~ /^(?:abc|ijk|abcdef|def)$/;
}
$y = time();
print "regex: " . ($y- $x);
它出现了以下输出(值在seconds
中),表明正则表达式更快(特别是在这种特殊情况下)!:
grep: 5
regex: 2