【问题标题】:Why My Haskell Code is so slow compare to Swift and C [duplicate]为什么我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]
【发布时间】:2018-12-29 03:26:52
【问题描述】:

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

哈斯克尔:

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

完成它需要 24.1 秒

斯威夫特: 使用标准 for 循环 0.05 秒

C: 使用标准 for 循环 0.022 秒

【问题讨论】:

  • 这个问题没有至少包含你的编译和执行的细节是没有意义的。
  • 好吧,也许您还必须包含 C 和/或 swift 版本的测试,否则,它就毫无意义了。

标签: haskell


【解决方案1】:

我测量了在 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

【讨论】:

  • 感谢指出,我是 Haskell 的新手
  • 即使在解释器中,我也看不到该代码需要 24 秒。它只是没有做那么多迭代。
  • @Carl 当我在 GHCi 中运行它时,我的盒子大约需要一半的时间。也许他只是有一台非常慢的电脑。
  • 是的,我的电脑是 Pentium 4E,很旧,我是个很可怜的孩子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多