分析简单的正则表达式搜索

时间:2013-12-14 20:48:32

标签: regex perl

我想测试perl中两种不同方法的性能,检查一个字符串是否完全包含在另一个字符串中。

第一种方法是将字符串转换为数组并逐个字符地测试,而第二种方法只是评估正则表达式(我认为它与所有字符的线性搜索具有相同的顺序,但不是招致为数组分配内存并将字符复制到其中的成本(尽管可能涉及其他成本))。

我做这个测试的最初方法是将两个程序(见下文)放在一个大的for循环(0到999999)中,然后计算程序完成所需的时间;起初看起来正如一场正则表达式匹配要快得多(12.926s vs 0.318s);但是我接着考虑了这样一种可能性,即在评估正则表达式之后,下面的迭代很简单,因为它是缓存的。为了测试这个,我把我的for循环放在命令行上(使perl脚本的每次迭代循环0到0“无记忆”)并注意到它们都是相似的(虽然有时与平均值有一些分歧) )。但我强烈怀疑这可能是一个糟糕的结论,因为启动脚本所花费的时间可能会占据脚本的执行时间。

有没有办法(特别是当我想看一些不那么微不足道的东西时),关闭缓存(如果那是当然发生的事情),这样我就可以在for循环中公平地运行程序(所以我可以只调用一次脚本)?

或者在这个例子中,没有什么聪明的事情,并且正则表达式搜索确实更快

my $teststr = "testing testing";
my $teststr2 = "testing tasted";
my $match = 1;

#procedure one - character by character checking
for (my $i = 0; $i < 1; $i++)
{
    my @chrArr = split //, $teststr;
    my @chrArr2 = split //, $teststr2;
    for (my $j = 0; $j < @chrArr2; $j++)
    {
        if($chrArr[$j] != $chrArr2[$j])
        {
            $match = 0;
            break;
        }
    }
}

#procedure 2 - regex matching
for (my $i = 0; $i < 1; $i++)
{
    if($teststr !~ m/$teststr2/)
    {
        $match = 0;
    }
}

2 个答案:

答案 0 :(得分:1)

为什么不使用Benchmark模块。它应该完全适合这里。

使用Benchmark qw(timethese cmpthese);

- CMIC

答案 1 :(得分:0)

正则表达式匹配/搜索是线性的。编译模式很昂贵。如果在每次迭代时更改$ teststr2,则无法进行缓存。例如:

#procedure 2 - regex matching
for (my $i = 0; $i < 1; $i++)
{
    if($teststr !~ m/${i}$teststr2/)
    {
        $match = 0;
    }
}