如何评估正则表达式匹配或字符串比较是否更快

时间:2014-03-22 09:12:46

标签: regex perl

我如何评估哪个表达式更快:

grep($var eq $_, qw(abc ijk abcdef def))

OR

$var =~ /^abc|ijk|abcdef|def$/

修改:将正则表达式更正为:

$var =~ /^(?:abc|ijk|abcdef|def)$/

2 个答案:

答案 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