Project Euler's Challenge 14 のコードをHaskellとC++の両方で作成しました(ideone リンク)。どちらも、以前に配列で行った計算を記憶しています。
それぞれ とを使用するghc -O2
とg++ -O3
、C++ は Haskell バージョンよりも 10 ~ 15 倍速く実行されます。
Haskell バージョンの実行速度が遅くなる可能性があり、Haskell の方が書き込みに適した言語であることは理解していますが、Haskell バージョンを高速に実行できるようにするためにコードを変更できることを知っておくとよいでしょう (理想的には 2 倍または 2 倍以内)。 C++ バージョンの 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++ バージョンに近づける可変配列バージョンの改善点を知りたいです。