D looses in speed to Common Lisp

Daniel Kozak via Digitalmars-d digitalmars-d at puremagic.com
Mon May 11 14:59:58 PDT 2015


On Mon, 11 May 2015 21:15:31 +0000
Dzhon Smit via Digitalmars-d <digitalmars-d at puremagic.com> wrote:

> Just in case you wonder, here's a comparison of the Fibonacci 
> numbers.  The D code was written by Dennis Ritchie (a user of 
> this forum, not the guy who invented C).
> 
> [code]import std.stdio, std.bigint;
> 
> void main() {
> 
>      BigInt[] fib1, fib2;
>      BigInt last = 0, next = 1;
> 
>      int n = 100000;
> 
>      int i;
>      while (i != n) {
>          fib1 ~= last, last = next, next += fib1[$ - 1];
>          ++i;
>      }
> 
>      i = 0, last = 0, next = 1;
>      while (i != n) {
>          fib2 ~= last, last = next, next += fib2[$ - 1];
>          ++i;
>      }
> 
>      BigInt sumFib1;
>      foreach (e; fib1) {
>          sumFib1 += e;
>      }
> 
>      BigInt sumFib2;
>      foreach (e; fib2) {
>          sumFib2 += e;
>      }
> 
>      writeln(sumFib2 - sumFib1); // 0
> }[/code]
> [code];;;; fib.lisp
> (defun main ()
>    (let ((n 100000))
>      (let ((fib1 (do ((i 0 (incf i))
>                       (last 0 next)
>                       (next 1 (+ next last))
>                       (fib '() (cons last fib)))
>                    ((= i n) (nreverse fib))))
>            (fib2 (do ((i 0 (incf i))
>                       (last 0 next)
>                       (next 1 (+ next last))
>                       (fib '() (cons last fib)))
>                    ((= i n) (nreverse fib)))))
>        (let ((sum-fib-1 (loop :for e :in fib1 :sum e))
>              (sum-fib-2 (loop :for e :in fib2 :sum e)))
>          (- sum-fib-2 sum-fib-1)))))
> 
> (format t "~D~%" (main))[/code]
> 
> Tests on my machine:
> [code]$ time ./fib
> 0
> 
> real    0m6.458s
> user    0m2.250s
> sys     0m0.933s
> $ time sbcl --dynamic-space-size 4GB --script fib.lisp
> 0
> 
> real    0m1.884s
> user    0m1.290s
> sys     0m0.260s[/code]
> 
> [quote]Email address
> 
> When posting, you need to indicate an email address. It doesn't 
> need to be a valid one; this software will not send anything to 
> the specified address. The email address will be made public to 
> other users of the news server / mailing list you are posting to. 
> Therefore, please be aware that malicious robots may be able to 
> collect your address and send spam to it.[/quote]
> 
> This is quite disappointing, I'd prefer spam from this forum 
> rather than from elsewhere.

On my machine this is much faster

import std.stdio, std.bigint;
import std.range;
import std.algorithm;

void main() {

     int n = 100000;
     auto sumFib1 = recurrence!("a[n-1] + a[n-2]")(BigInt(0),
             BigInt(1)).take(n).sum;
     auto sumFib2 = recurrence!("a[n-1] + a[n-2]")(BigInt(0),
             BigInt(1)).take(n).sum;

     writeln(sumFib2 - sumFib1); // 0
}




More information about the Digitalmars-d mailing list