有谁知道如何让Haskell代码更快乐?我在做Project Euler #14。 这段代码在4.029秒运行:让Haskell代码更快更快
collatz :: Int -> Int64 -> Int
collatz c 1 = c
collatz c k
| even k = collatz (c+1) (k `div` 2)
| otherwise = collatz (c+1) (3*k + 1)
main = do
print $ maximum (map (\i -> (collatz 1 i, i)) [1..1000000])
Memoizing的在Collatz功能实际上增加了运行时间,所以我没有做任何记忆化。 可比C代码0.239秒运行:
int main(int argc, char *argv[])
{
int maxlength = 0;
int maxstart = 1;
for (int i = 1; i <= 1000000; i++) {
unsigned long k = i;
int length = 1;
while (k > 1) {
length += 1;
if (k % 2 == 0)
k = k/2;
else
k = 3*k + 1;
}
if (length > maxlength) {
maxlength = length;
maxstart = i;
}
}
printf("%d, %d\n", maxlength, maxstart);
return 0;
}
Haskell的代码被编译以GHC -O3和C代码用gcc -std = C99 -O3编译。
严格标注是'shiftR x 1'而不是'div x 2'所遵循的第一件事(是的,一些关键优化仍然缺失)。这让你与C的距离很远。 – 2014-12-18 23:57:56
这个特殊的欧拉问题在过去产生了大量类似的性能问题。看看[这个搜索](http://stackoverflow.com/search?q= [haskell] + collatz)一堆建议。 [This one](http://stackoverflow.com/questions/13669134/c-vs-haskell-collatz-conjecture-speed-pearison/13669277#13669277)可能特别相关。 – 2014-12-19 00:22:08
你有LLVM吗?它在-21 -fllvm的机器上运行1.3秒。 – 2014-12-19 00:52:05