【问题标题】:Filtering with regex and .contains in Perl 6在 Perl 6 中使用正则表达式和 .contains 进行过滤
【发布时间】:2018-04-13 13:38:06
【问题描述】:

我经常需要过滤包含一些子字符串(例如一个字符)的字符串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

为什么会这样?

【问题讨论】:

  • perl6 --profile example.p6
  • @BradGilbert 很棒的工具!但恐怕我无法解释结果。

标签: raku


【解决方案1】:

在一个完全不科学的实验中,我刚刚切换了正则表达式版本和包含版本,发现您测量的性能差异不是“正则表达式与包含”,而是“第一件事与第二件事”:

何时包含优先:

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,了解它如何为您比较两段代码。

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多