【发布时间】: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