在 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
所花费的时间。在大多数情况下(正如预期的那样),.contains
比 regex
快得多,尤其是当 @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 了解它如何为您比较两段代码。
我经常需要过滤 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
所花费的时间。在大多数情况下(正如预期的那样),.contains
比 regex
快得多,尤其是当 @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 了解它如何为您比较两段代码。