Почему вычисление фибоначчи в javascript быстрее, чем в haskell?

1

Как видно из приведенных ниже примеров, javascript/node намного быстрее, чем haskell.
Но haskell скомпилирован и основан на C. В этом примере вы видите, что C является самым быстрым. Как получается, что haskell настолько медленен в сравнении?

JS выполняется узлом:

function fib(n) {
    if ( n==0 || n==1 )
        return 1;

    return fib(n-2)+fib(n-1);
}
console.log(fib(30));

$ time node fib.js
1346269
реальный 0m0,045s
пользователь 0m0,040s
sys 0m0,004s

Haskell:

fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = print (fib 30)

$ ghc -o fibh fib.hs
$ time./fibh
1346269
реальный 0m0,178s
пользователь 0m0,168s
sys 0m0,000s

с:

#include <stdio.h>

int fib(int n) {
    if (n == 0 || n == 1) 
        return 1;

    return fib(n-1)+fib(n-2);
}

int main() {
    int f = fib(30);
    printf("cfib: %i\n", f);
}

$ gcc fib.c -o fibc
$ time./fibc
cfib: 1346269
реальный 0m0,023s
пользователь 0m0,020s
sys 0m0,000s

EDIT1:

haskell с -o 2, как предлагается

$ ghc -O2 -o fibh fib.hs
$ time ./fibh
1346269
real 0m0,166s
user 0m0,160s
sys 0m0,004s
  • 4
    Что если вы добавите -O2 к компилятору?
  • 5
    Haskell, вероятно, по умолчанию тоже использует арифметику произвольной точности ...
Показать ещё 7 комментариев
Теги:
performance
haskell
fibonacci

1 ответ

10
Лучший ответ

Это просто из-за разницы между GMP Integer и машиной Int s:

% cat fib.hs
fib :: Int -> Int -- N.B. default is 'Integer'
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = print (fib 30)


% ghc -O2 fib.hs && time ./fib
1346269
./fib  0.01s user 0.00s system 87% cpu 0.013 total
  • 0
    Не только это, но и то, является ли алгоритм хвостовым рекурсивным или нет. Haskell Wiki показывает разные алгоритмы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню