为啥我的 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 工作良好?