在 Perl 6 中使用正则表达式和 .contains 进行过滤

Filtering with regex and .contains in Perl 6

我经常需要过滤 array 个字符串的元素,其中包含一些子字符串(例如一个字符)。由于它可以通过匹配 regex.contains 方法来完成,我决定进行一个小测试以确保 .contains 更快(因此更合适)。

my @array = "aa" .. "cc";
my constant $substr = 'a';

my $time1 = now;
my @a_array = @array.grep: *.contains($substr);
my $time2 = now;
@a_array = @array.grep: * ~~ /$substr/;
my $time3 = now;

my $time_contains = $time2 - $time1;
my $time_regex    = $time3 - $time2;
say "contains: $time_contains sec";
say "regex:    $time_regex sec";

然后我更改 @array 的大小和 $substr 的长度,并比较每种方法过滤 @array 所花费的时间。在大多数情况下(正如预期的那样),.containsregex 快得多,尤其是当 @array 很大时。但是如果 @array 很小(如上面的代码),regex 会稍微快一些。

contains: 0.0015010 sec
regex:    0.0008708 sec

为什么会这样?

在一个完全不科学的实验中,我只是切换了 regex 版本和 contains 版本,发现你测量的性能差异不是 "regex vs contains",而是 "first thing versus second thing":

当先包含时:

contains: 0.001555  sec
regex:    0.0009051 sec

当正则表达式在前时:

regex:    0.002055 sec
contains: 0.000326 sec

正确进行基准测试是一项艰巨的任务。真的很容易不小心测量出与你想要弄清楚的东西不同的东西。

当我想比较多个事物的性能时,我通常会 运行 每个事物都在一个单独的脚本中,或者可能有一个共享脚本但一次只有 运行 一个任务(例如使用 multi sub MAIN("task1") 方法)。这样任何启动工作都可以共享。

在 freenode 的 #perl6 IRC 频道中,我们有一个名为 benchable6 的机器人,它可以为您做基准测试。阅读 the section "Comparing Code" on its wiki page 了解它如何为您比较两段代码。