【发布时间】:2013-12-16 01:58:24
【问题描述】:
我想在 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;
}
}
【问题讨论】:
-
你应该看看
Benchmark模块。 -
这看起来很有用 - 谢谢,我会玩的
-
现在播放完成(好工具!)...这两种方法(n=10^7)的时间是 5.11s 用于 char-by-char(包括数组复制)和 2.99正则表达式。这更符合我的预期(我第一次测试的 40 倍看起来太好了)