Optymalizacja GHC: przypuszczenie Collatza

Napisałem kod dlaWyzwanie projektu Eulera 14, zarównoHaskell iC ++ (linki ideone). Oboje pamiętają wszystkie obliczenia, które wcześniej wykonali w tablicy.

Za pomocąghc -O2 ig++ -O3 odpowiednio C ++ działa 10-15 razy szybciej niż wersja Haskell.

Chociaż rozumiem, że wersja Haskell może działać wolniej, a Haskell jest ładniejszym językiem do pisania, fajnie byłoby poznać pewne zmiany kodu, które mogę wprowadzić do wersji Haskella, aby działał szybciej (najlepiej w przedziale 2 lub 3 wersji C ++)?

Kod Haskella jest tutaj:

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)

Edytować:

Wykonałem także wersję wykorzystującą niezapisane zmienne tablice. Jest to wciąż 5 razy wolniejsze niż wersja C ++, ale znacząca poprawa. Kod jest na ideonetutaj.

Chciałbym dowiedzieć się o ulepszeniach wersji zmiennych tablicy, które przybliżają ją do wersji C ++.

questionAnswers(2)

yourAnswerToTheQuestion