我经常需要过滤元素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
为什么会出现这种情况?
在一个完全不科学的实验中,我只是切换了正则表达式版本和包含版本,发现您测量的性能差异不是“正则表达式与包含”,而是实际上“第一件事与第二件事”:
当 contains 优先时:
contains: 0.001555 sec
regex: 0.0009051 sec
当正则表达式首先出现时:
regex: 0.002055 sec
contains: 0.000326 sec
正确地进行基准测试是一项艰巨的任务。很容易意外地测量出与您想要的结果不同的东西。
当我想比较多个任务的性能时,我通常会在单独的脚本中运行每个任务,或者可能有一个共享脚本,但一次只运行其中一个任务(例如使用multi sub MAIN("task1")
方法)。这样任何启动工作都可以共享。
在 freenode 上的 #perl6 IRC 频道中,我们有一个名为 benchable6 的机器人,它可以为您做基准测试。读其 wiki 页面上的“比较代码”部分 https://github.com/perl6/whateverable/wiki/Benchable#comparing-code了解它如何为您比较两段代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)