2011-07-13 23 views
6

David Terei在他的博客文章The Glasgow Haskell Compiler and LLVM中使用了一個生成冰雹序列的例子來比較GHC與C的性能。我決定自己運行它,結果令人難以置信:GHC版本慢了一個數量級。該代碼是足夠無辜:haskell中產生的冰雹序列比c中慢1個數字

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(32位)+ OS X 10.6.6與gcc 4.2.1。大衛在他的帖子中使用了GHC 6.13。這是GHC 7.0.3的一個已知錯誤嗎?或者我一定錯過了一些非常明顯的東西。

編輯︰原來我沒有想到明顯的東西。通過簡單地使用-O2標誌,ghc現在生成非常快的代碼。

+4

你正在使用哪種編譯標誌?對我來說,這個代碼在用'ghc-7.0.4 -O2'編譯時以4s執行。 '-O'只是稍微慢一些。 –

+3

@John L,我用'''--make -fforce-recomp -fllvm'''。按照您的建議,使用''-O2''',ghc與gcc一致。謝謝。 – edwardw

+0

@edwardw,你的問題是什麼? – eternalmatt

回答

6

我的問題是爲什麼GHC在這種特殊情況下產生這樣慢的代碼。答案是使用優化標誌-O,-O2等。通過使用它,我看到執行時間從45+秒下降到0.6秒,大約提高了80倍。