GHC-Optimierung: Collatz-Vermutung

Ich habe Code für das geschriebenProjekt Eulers Herausforderung 14, sowohlHaskell undC ++ (ideone links). Beide erinnern sich an alle Berechnungen, die sie zuvor in einem Array durchgeführt haben.

Verwendenghc -O2 undg++ -O3 Das C ++ läuft 10-15 mal schneller als die Haskell-Version.

Obwohl ich verstehe, dass die Haskell-Version möglicherweise langsamer läuft und dass Haskell eine schönere Sprache zum Schreiben ist, wäre es schön, einige Codeänderungen zu kennen, die ich an der Haskell-Version vornehmen kann, um sie schneller laufen zu lassen (idealerweise innerhalb eines Faktors von 2 oder weniger) 3 der C ++ Version)?

Haskell-Code ist hier:

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)

Bearbeiten:

Ich habe jetzt auch eine Version mit unverpackten veränderbaren Arrays erstellt. Es ist immer noch 5-mal langsamer als die C ++ - Version, aber eine deutliche Verbesserung. Der Code ist auf ideoneHier.

Ich würde gerne Verbesserungen an der veränderlichen Array-Version erfahren, die sie näher an die C ++ - Version bringen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage