Я работаю над проблемами Project Euler как способ обучения Haskell, и я считаю, что мои программы намного медленнее чем сопоставимая версия C, даже при компиляции. Что я могу сделать для ускорения моих программ Haskell?
Например, мое решение для грубой силы Проблема 14:
import Data.Int
import Data.Ord
import Data.List
searchTo = 1000000
nextNumber :: Int64 -> Int64
nextNumber n
| even n = n `div` 2
| otherwise = 3 * n + 1
sequenceLength :: Int64 -> Int
sequenceLength 1 = 1
sequenceLength n = 1 + (sequenceLength next)
where next = nextNumber n
longestSequence = maximumBy (comparing sequenceLength) [1..searchTo]
main = putStrLn $ show $ longestSequence
Занимает около 220 секунд, тогда как "эквивалентная" версия с грубой силой C занимает всего 1,2 секунды.
#include <stdio.h>
int main(int argc, char **argv)
{
int longest = 0;
int terms = 0;
int i;
unsigned long j;
for (i = 1; i <= 1000000; i++)
{
j = i;
int this_terms = 1;
while (j != 1)
{
this_terms++;
if (this_terms > terms)
{
terms = this_terms;
longest = i;
}
if (j % 2 == 0)
j = j / 2;
else
j = 3 * j + 1;
}
}
printf("%d\n", longest);
return 0;
}
Что я делаю неправильно? Или я наивно полагаю, что Haskell мог даже приблизиться к скорости C?
(Я компилирую версию C с gcc -O2 и версию Haskell с помощью ghc -make -O).