## Farooq's

After I read a small paper named How to make Lisp go faster than C I decided to do some small benchmarking myself with C++ and Common Lisp. For benchmarking I have written programs which find prime numbers from 2 up to 384460. All programs were run on my laptop with the following specs and properties:

#### C++

bool isprime(unsigned long n) {
if (n < 2) return false;
for (unsigned long i = 2; i < n; i++) {
if (n%i == 0) return false;
}
return true;
}
int main() {
unsigned count = 0;
for (unsigned long i = 2; i <= 384460; i++) {
if (isprime(i)) {
count++;
}
}
return count;
}


And the time this program took to find all prime numbers in the given range without optimizing(clang++ prime.cpp):

real    1m2.907s
user    1m2.816s
sys 0m0.084s


And with -O3 option:

real    0m54.604s
user    0m54.566s
sys 0m0.008s


Also with -O2 option:

real    0m53.953s
user    0m53.953s
sys 0m0.000s


#### Common Lisp untyped

Code:

(defun isprime (n)
(if (< n 2)
nil
(loop for i from 2 to (1- n)
when (zerop (mod n i))
return nil
finally
(return t))))

(defun main ()
(loop for i from 2 to 384460 count (isprime i)))

(main)


And the time it took:

real    2m0.889s
user    2m0.805s
sys 0m0.078s


Common Lisp typed and optimized

(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defun isprime (n)
(declare (type fixnum n))
(if (< n 2)
nil
(loop for i fixnum from 2 to (1- n)
when (zerop (mod n i))
return nil
finally
(return t))))

(defun main ()
(loop for i fixnum from 2 to 384460 count (isprime i)))

(main)


And the time it took:

real    0m59.837s
user    0m59.755s
sys 0m0.070s


As you see according to these results CL typed and optimized code is a bit slower than the C++ version. However someone who helped me a lot in #clschool on freenode reported that both C++ version and CL typed version ran in 21.6s.

NOTE: I used SBCL for both typed and untyped versions

#### Thanks to

• People in #clschool who helped me
• Didier Verna for his good paper