素数を印刷し、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番目の素数を印刷します.

同時バージョン

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;