Farooq's Website

Home | Projects | Files on bitcoinshell

C++ vs Common Lisp performance

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:

Farooq's laptop specs

C++

Here's my code in 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

Code:

(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 version

Thanks to