use strict; use warnings; use 5.010; use Benchmark qw{ cmpthese }; use Test::More qw{ no_plan }; my %methods = ( eratosthenes => sub { my $toTest = shift; my $sqrtLimit = sqrt $toTest; my $sieve = q{}; vec( $sieve, 0 , 1 ) = 1; vec( $sieve, 1 , 1 ) = 1; vec( $sieve, $toTest, 1 ) = 0; my $marker = 1; while ( $marker < $sqrtLimit ) { my $possPrime = $marker + 1; $possPrime ++ while vec( $sieve, $possPrime, 1 ); my $fill = 2 * $possPrime; while ( $fill <= $toTest ) { vec( $sieve, $fill, 1 ) = 1; $fill += $possPrime; } last if vec( $sieve, $toTest, 1 ); $marker = $possPrime; } return not vec( $sieve, $toTest, 1 ); }, tobyink => sub { my $num = shift; return 0 if $num == 1; # 1 is not prime for my $div (2 .. sqrt $num) { return 0 if $num % $div == 0; } return 1; }, tobyinkPlus => sub { my $toTest = shift; return 0 if $toTest == 1; return 1 if $toTest == 2; return 0 unless $toTest % 2; my $sqrtLimit = sqrt $toTest; for ( my $div = 3; $div <= $sqrtLimit; $div += 2 ) { return 0 unless $toTest % $div; } return 1; }, ); say qq{Testing with value 2 which is a prime}; foreach my $method ( sort keys %methods ) { ok( $methods{ $method }->( 2 ) == 1, qq{$method} ); } say qq{Testing with value 8357 which is not a prime}; foreach my $method ( sort keys %methods ) { ok( $methods{ $method }->( 8357 ) == 0, qq{$method} ); } say qq{Testing with value 9293 which is a prime}; foreach my $method ( sort keys %methods ) { ok( $methods{ $method }->( 9293 ) == 1, qq{$method} ); } my @testValues; push @testValues, int rand 1e6 for 1 .. 20; cmpthese( -20, { map { my $codeStr = q[sub { my $isPrime = $methods{ ] . $_ . q[ }->( $_ ) for @testValues; }]; $_ => eval $codeStr; } keys %methods } ); #### Testing with value 2 which is a prime ok 1 - eratosthenes ok 2 - tobyink ok 3 - tobyinkPlus Testing with value 8357 which is not a prime ok 4 - eratosthenes ok 5 - tobyink ok 6 - tobyinkPlus Testing with value 9293 which is a prime ok 7 - eratosthenes ok 8 - tobyink ok 9 - tobyinkPlus Rate eratosthenes tobyink tobyinkPlus eratosthenes 0.154/s -- -100% -100% tobyink 1291/s 838266% -- -35% tobyinkPlus 1984/s 1288047% 54% -- 1..9