【发布时间】:2018-04-02 16:40:09
【问题描述】:
我以前只使用bash 正则表达式、grep、sed、awk 等。在尝试Perl 6 regexes 之后,我的印象是它们的工作速度比我慢会期望,但可能原因是我处理不当。
我做了一个简单的测试来比较Perl 6 和bash 中的类似操作。这是Perl 6 代码:
my @array = "aaaaa" .. "fffff";
say +@array; # 7776 = 6 ** 5
my @search = <abcde cdeff fabcd>;
my token search {
@search
}
my @new_array = @array.grep({/ <search> /});
say @new_array;
然后我将@array打印到一个名为array的文件中(有7776行),用3行(abcde、cdeff、fabcd)创建了一个名为search的文件并做了一个简单的@ 987654337@搜索。
$ grep -f search array
在两个程序按预期产生相同结果后,我测量了它们的工作时间。
$ time perl6 search.p6
real 0m6,683s
user 0m6,724s
sys 0m0,044s
$ time grep -f search array
real 0m0,009s
user 0m0,008s
sys 0m0,000s
那么,我在 Perl 6 代码中做错了什么?
UPD:如果我将搜索标记传递给grep,循环通过@search 数组,程序运行得更快:
my @array = "aaaaa" .. "fffff";
say +@array;
my @search = <abcde cdeff fabcd>;
for @search -> $token {
say ~@array.grep({/$token/});
}
$ time perl6 search.p6
real 0m1,378s
user 0m1,400s
sys 0m0,052s
如果我手动定义每个搜索模式,它的工作速度会更快:
my @array = "aaaaa" .. "fffff";
say +@array; # 7776 = 6 ** 5
say ~@array.grep({/abcde/});
say ~@array.grep({/cdeff/});
say ~@array.grep({/fabcd/});
$ time perl6 search.p6
real 0m0,587s
user 0m0,632s
sys 0m0,036s
【问题讨论】:
标签: raku