代码托管在https://github.com/yeahnoob/perl6-perf,如下所示:
use v6;
my $file=open "wordpairs.txt", :r;
my %dict;
my $line;
repeat {
$line=$file.get;
my ($p1,$p2)=$line.split(' ');
if ?%dict{$p1} {
%dict{$p1} = "{%dict{$p1}} {$p2}".words;
} else {
%dict{$p1} = $p2;
}
} while !$file.eof;
在"wordpairs.txt"文件较小的情况下,运行良好。但当该文件包含约14万行(每行两个单词)时,运行速度变得非常慢。即使运行20秒后,它也无法完成自身。这是什么问题?代码有问题吗?感谢任何帮助!以下内容添加于2014-09-04,感谢SE Answers和IRC@freenode#perl6提出的许多建议。 代码(截至目前,2014-09-04):
my %dict;
grammar WordPairs {
token word-pair { (\S*) ' ' (\S*) "\n" }
token TOP { <word-pair>* }
}
class WordPairsActions {
method word-pair($/) { %dict{$0}.push($1) }
}
my $match = WordPairs.parse(slurp, :actions(WordPairsActions));
say ?$match;
现在的运行时间成本为:
$ time perl6 countpairs.pl wordpairs.txt
True
The pairs count of the key word "her" in wordpairs.txt is 1036
real 0m24.043s
user 0m23.854s
sys 0m0.181s
$ perl6 --version
This is perl6 version 2014.08 built on MoarVM version 2014.08
目前来看,这个测试的时间表现还不够合理(因为同样的 Perl 5 代码只需要约160毫秒),但比我原来的旧 Perl6 代码好多了。 :)
PS. 整个内容,包括原始测试代码、补丁和示例文本,都在 Github 上。