素数を印刷し、Perl 6の現在の速度をテストします.
1740 ワード
This is Rakudo version 2016.07.1 built on MoarVM version 2016.07 implementing Perl 6.c.
今のPerl 6はまだ遅いです.ここでは、1から数えた10,000番目の素数を印刷します.
上の同時検索素数は、35秒以上かかります!butの役割は
今のPerl 6はまだ遅いです.ここでは、1から数えた10,000番目の素数を印刷します.
同時バージョン
sub find-prime($count) {
my $channel = Channel.new;
my $promise = start {
for ^$count {
$channel.send($_) if .is-prime;
}
LEAVE $channel.close unless $channel.closed;
}
return $channel.list but role :: { method channel { $channel } };;
}
my @primes = find-prime(110000);
for @primes {
@primes.channel.close if $++ > 5000; # hard-close the channel after 5000 found files
.say if $++ %% 100 # print every 100th file
}
say @primes[10000];
say now - INIT now;
上の同時検索素数は、35秒以上かかります!butの役割は
does
に類似している.gather/take版
my @vals = lazy gather {
for ^Inf {
take $_ if .is-prime;
}
}
say @vals[10000];
say now - INIT now;
gather/take
はPythonのyield
に似ており、25秒以上かかります.通常バージョン
is-prime
関数を使用しない場合、10000番目の素数を検索するのは遅いです.# ,
lazy gather {
CANDIDATE: for 2 .. 110000 -> $candidate {
for 2 .. sqrt $candidate -> $divisor {
next CANDIDATE if $candidate % $divisor == 0;
}
take $candidate;
}
} ==> my @vals;
say @vals[10000];
say now - INIT now;
lazy gather {
for ^Inf {
take $_ if .is-prime;
}
} ==> my @vals;
say @vals[10000];
say now - INIT now;
my @vals = lazy gather {
for 1..110000 {
take $_ if (2 ** ($_ - 1) % $_ == 1 || $_ == 2);
}
}
say @vals[10000];
say now - INIT now;