我已經編寫代碼爲Project Euler's Challenge 14,在Haskell和C++(ideone鏈接)。他們都記得他們之前在數組中做過的任何計算。GHC優化:Collatz猜想
分別使用ghc -O2
和g++ -O3
,C++運行速度比Haskell版本快10-15倍。
儘管我明白Haskell版本可能運行速度較慢,並且Haskell是一種更好的語言編寫方式,但知道我可以對Haskell版本進行一些代碼更改以使其運行速度更快(理想情況下, C++版本的2或3的因子)?
Haskell代碼是在這裏:
import Data.Array
import Data.Word
import Data.List
collatz_array =
let
upperbound = 1000000
a = array (1, upperbound) [(i :: Word64, f i :: Int) | i <- [1..upperbound]]
f i = i `seq`
let
check_f i = i `seq` if i <= upperbound then a ! i else f i
in
if (i == 1) then 0 else (check_f ((if (even i) then i else 3 * i + 1) `div` 2)) + 1
in a
main =
putStrLn $ show $
foldl1' (\(x1,x2) (y1,y2) -> if (x2 >= y2) then (x1, x2) else (y1, y2)) $! (assocs collatz_array)
編輯:
現在我也做使用未裝箱的可變陣列版本。它仍然比C++版本慢5倍,但是是一個顯着的改進。代碼在ideone here。
我想知道改進的可變陣列版本,使其更接近C++版本。
僅供參考,使用'-fllvm'進行編譯可以在我的機器上將性能提高約10%。 –
你的'seq'沒有什麼區別;你的功能在'i'中都是嚴格的。在32位平臺上,64位算法的GHC曾經非常糟糕,但我不知道你在使用什麼平臺。 – augustss
請勿使用'div',請使用'quot'。 – augustss