【发布时间】:2015-12-30 17:03:29
【问题描述】:
感兴趣的问题是通过使其更快来增强以下递归深度为 100,000,000 的 Haskell 程序:
s :: Int32 -> Int32 -> IO Int32
s 0 acc = return $! acc
s n acc = do r <- randomRIO (0, maxBound :: Int32)
s (n-1) $! (acc + r)
main = do z <- s 100000000 0
putStrLn $ show z
这个程序在我的机器上大约需要 70 秒。 然而,一个对应的 C 程序只需要一秒钟:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
double startTime;
double timeEllapsed;
unsigned int sum;
long long i;
startTime = clock();
srand(time(NULL));
sum = 0;
i = 0;
for(i=0; i<100000000;i++){
sum += rand();
}
timeEllapsed = (clock() - startTime) / (CLOCKS_PER_SEC);
printf("sum = %u, time ellapsed = %lfs\n", sum, timeEllapsed);
return EXIT_SUCCESS;
}
这种差异从何而来? Haskell标准库中随机数的实现是不是比较慢?还是应该使用与 randomRIO 不同的函数?还是与惰性评估有关? 你能优化 Haskell 程序上的任何内容并使其更快吗?
很明显,像 Haskell 和 C 这样的高级语言之间可能存在性能差异,但我没想到它会慢约 70 倍,所以我想知道原因。
【问题讨论】:
标签: performance haskell recursion random