为啥我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]

Posted

技术标签:

【中文标题】为啥我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]【英文标题】: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 版本的测试,否则,它就毫无意义了。 【参考方案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,很旧,我是个很可怜的孩子。

以上是关于为啥我的 Haskell 代码与 Swift 和 C 相比如此缓慢 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Haskell ghc 不工作,但 runghc 工作良好?

为啥我的haskell程序这么慢? Haskell 编程,人生游戏

为啥这个 Haskell 程序表现如此糟糕?

为啥以下 Haskell 代码是不确定的?

为啥我的 Haskell 函数参数必须是 Bool 类型?

将“为啥函数式编程很重要”翻译成 Haskell