【问题标题】:One magnitude slower generating hailstone sequence in haskell than in c在haskell中生成冰雹序列比在c中慢一个数量级
【发布时间】:2011-07-13 06:34:51
【问题描述】:

在他的博客文章The Glasgow Haskell Compiler and LLVM 中,David Terei 使用了一个生成冰雹序列的示例来比较 GHC 与 C 的性能。我决定自己运行它,结果令人难以置信:GHC 版本慢了一个数量级以上。代码够纯真的:

import Data.Word

collatzLen :: Int -> Word32 -> Int
collatzLen c 1 = c
collatzLen c n | n `mod` 2 == 0 = collatzLen (c+1) $ n `div` 2
               | otherwise      = collatzLen (c+1) $ 3*n+1

pmax x n = x `max` (collatzLen 1 n, n)

main = print . solve $ 1000000
    where solve xs = foldl pmax (1,1) [2..xs-1]

除了用foldl' 代替foldl,我认为我无能为力。无论我使用哪个后端,GHC 版本都在 45+ 秒内找到答案,而 C 版本只需 1.5 秒!

我的设置是 Haskell 平台 2011.2.0.1 (32bit) + OS X 10.6.6 vs. gcc 4.2.1。 David 在他的帖子中使用了 GHC 6.13。这是 GHC 7.0.3 的已知错误吗?或者我一定错过了一些非常明显的东西。

编辑:结果我确实错过了一些明显的东西。通过简单地使用-O2 标志,ghc 现在可以生成非常快的代码。

【问题讨论】:

  • 您使用了哪些编译标志?对我来说,这段代码在使用ghc-7.0.4 -O2 编译时会在 4 秒内执行。 '-O' 只是稍微慢一点。
  • @John L,我使用了--make -fforce-recomp -fllvm。通过按照您的建议使用-O2,ghc 与 gcc 相当。谢谢。
  • @edwardw,你有什么问题?
  • @eternalmatt 我的问题是为什么 ghc 在这种情况下会产生慢代码。已经解决了。

标签: haskell


【解决方案1】:

我的问题是为什么 GHC 在这种特殊情况下会生成如此缓慢的代码。答案是使用优化标志,-O-O2 等。通过使用它,我看到执行时间从 45+ 秒下降到 0.6 秒,提高了约 80 倍。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多