为什么我的Haskell代码比Swift和C这么慢

时间:2018-07-20 19:07:00

标签: haskell

这是一个非常简单的Haskell代码,用于查找满足毕达哥拉斯定理X ^ 2 = Y ^ 2 + Z ^ 2的所有毕达哥拉斯整数(从1到200)

Haskell:

let l = [1..200]
let pythagoras = [ x | x <- l, y <- l, z <- l, x^2 == y^2 + z^2]

完成它需要 24.1秒

迅速: 使用标准的循环 0.05秒

C: 使用标准的循环 0.022秒

enter image description here

1 个答案:

答案 0 :(得分:9)

我测量了0.03 seconds中运行的Haskell代码,使我相信您已经在解释器中运行了该代码(用于开发,而不是执行性能),而不是编译代码。另外,您可能将类型默认为Integer而不是使用机器的Int值。

tommd@HalfAndHalf /tmp% ghc -O2 t.hs && time ./t >/dev/null
[1 of 1] Compiling Main             ( t.hs, t.o )
Linking t ...
./t > /dev/null  0.03s user 0.00s system 87% cpu 0.040 total
tommd@HalfAndHalf /tmp% cat t.hs

main :: IO ()
main = do
  let l = [1..200] :: [Int]
  let pythagoras = [ x | x <- l, y <- l, z <- l, x^2 == y^2 + z^2]
  print pythagoras