use strict; use warnings; use feature 'say'; use Benchmark qw/timethis/; use Inline 'C'; my $search_to = 3000000; timethis -10, \&eratos_inline_c; # Thin wrapper to bind input params for the benchmark. sub eratos_inline_c { return @{inline_c_pa_eratos_primes( $search_to )}; } __DATA__ __C__ /* Find all primes up to 'search_to' using the Sieve of Eratosthenes. */ AV * inline_c_pa_eratos_primes ( int search_to ) { AV* av = newAV(); int* primes = 0; int i; Newx( primes, search_to + 1 , int ); if( ! primes ) croak( "Failed to allocate memory.\n" ); for( i = 0; i <= search_to; i++ ) primes[i] = 1; for( i = 2; i * i <= search_to; i++ ) { if( primes[i] ) { int j; for( j = i; j * i <= search_to; j++ ) primes[ i * j ] = 0; } } for( i = 2; i <= search_to; i++ ) { if( primes[i] == 1 ) av_push( av, newSViv( i ) ); } Safefree( primes ); return sv_2mortal( av ); }