# Primes

This benchmark computes all prime numbers lower than 10000000. It is repeated ten times.

## Results

The execution time is the user time added to the system time, as returned by the bash "time" command.

Python Perl Gambas Gambas + JIT
Execution time (s) 27.6 43.0 20.4 5.95
vs. Python 1 1.56 0.74 0.22
vs. Perl 0.64 1 0.47 0.14
vs. Gambas 1.35 2.11 1 0.29
vs. Gambas + JIT 4.64 7.23 3.43 1

## Python source code

``````#!/usr/bin/python

def get_primes(n):
if n < 2:  return []
if n == 2: return 
# do only odd numbers starting at 3
s = range(3, n+1, 2)
# n**0.5 simpler than math.sqr(n)
mroot = n ** 0.5
half = len(s)
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m*m-3)//2  # int div
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i+1
m = 2*i+3
return +[x for x in s if x]

for t in range(10):
res = get_primes(10000000)
print len(res)
``````

## Perl source code

``````#!/usr/bin/perl -w

use strict;
use warnings;

sub get_primes(\$)
\{
my (\$n) = @_;

if (\$n < 2) { return (); }
if (\$n == 2) { return (2); }
# do only odd numbers starting at 3
my @s = ();
for (my \$i = 3; \$i < \$n + 1; \$i += 2) {
push(@s, \$i);
}
# n**0.5 simpler than math.sqr(n)
my \$mroot = \$n ** 0.5;
my \$half = scalar @s;
my \$i = 0;
my \$m = 3;
while (\$m <= \$mroot) {
if (\$s[\$i]) {
my \$j = int((\$m*\$m - 3) / 2);
\$s[\$j] = 0;
while (\$j < \$half) {
\$s[\$j] = 0;
\$j += \$m;
}
}
\$i = \$i + 1;
\$m = 2*\$i + 3;
}
my @res = (2);
foreach (@s) {
push(@res, \$_) if (\$_);
}
return @res;
}

my @res;
for (1..10) {
@res = get_primes(10000000);
print scalar @res; print "\n";
}
``````

## Gambas source code

``````#!/usr/bin/env gbs3

Sub GetPrimes(N As Integer) As Integer[]

Dim aRes As New Integer[]
Dim S As Integer[]
Dim I, J, M As Integer
Dim iMRoot, iHalf As Integer

If N < 2 Then Return aRes

If N = 2 Then Return [ 2 ]

S = New Integer[(N - 3 + 1) \ 2]
For J = 3 To N Step 2
S[I] = J
Inc I
Next

iMRoot = Sqr(N)
iHalf = S.Count
I = 0
M = 3

While M <= iMRoot

If S[I] Then
J = (M * M - 3) \ 2
S[J] = 0
While J < iHalf
S[J] = 0
J += M
Wend
Endif

Inc I
M = 2 * I + 3

Wend

For Each I In S
Next

Return aRes

End

Dim aRes As Integer[]
Dim I As Integer

For I = 1 To 10
aRes = GetPrimes(10000000)
Print aRes.Count
Next
``````