首先,要认识到 GHCi 是一个解释器,它并不是为了速度而设计的。为了获得更有用的结果,您应该启用编译优化来编译代码。这可能会产生巨大的差异。
此外,对于任何严肃的 Haskell 代码基准测试,我建议使用 criterion。它使用各种统计技术来确保您获得可靠的测量结果。
我修改了您的代码以使用 criterion,并删除了打印语句,这样我们就不会计时 I/O。
import Criterion.Main
import Data.Vector as V
vector :: IO (Vector Int)
vector = do
let vec = V.replicate 3000000 10
return vec
sumit :: IO Int
sumit = do
vec <- vector
return $ V.sum vec
main = defaultMain [bench "sumit" $ whnfIO sumit]
使用
-O2
进行编译,在一台运行较慢的netbook上得到以下结果:
$ ghc --make -O2 Sum.hs
$ ./Sum
warming up
estimating clock resolution...
mean is 56.55146 us (10001 iterations)
found 1136 outliers among 9999 samples (11.4%)
235 (2.4%) high mild
901 (9.0%) high severe
estimating cost of a clock call...
mean is 2.493841 us (38 iterations)
found 4 outliers among 38 samples (10.5%)
2 (5.3%) high mild
2 (5.3%) high severe
benchmarking sumit
collecting 100 samples, 8 iterations each, in estimated 6.180620 s
mean: 9.329556 ms, lb 9.222860 ms, ub 9.473564 ms, ci 0.950
std dev: 628.0294 us, lb 439.1394 us, ub 1.045119 ms, ci 0.950
我得到了平均超过9毫秒和少于1毫秒的标准差。对于更大的测试用例,我得到了约100毫秒。
启用优化在使用vector包时尤为重要,因为它大量使用流融合,在这种情况下能够完全消除数据结构,将您的程序转换为高效的紧凑循环。
也许值得尝试使用-fllvm选项来尝试新的基于LLVM的代码生成器。
显然非常适合数值代码。
vector
包,可以查看这个优秀的教程:http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial - applicative