Outils pour l'analyse des performances d'un programme Haskell

Lors de la résolution de certains Projet Euler Problèmes pour apprendre Haskell (donc, actuellement, je suis totalement débutant) je suis venu sur Problème 12. J'ai écrit ce (naïve) solution:

--Get Number of Divisors of n
numDivs :: Integer -> Integer
numDivs n = toInteger $ length [ x | x<-[2.. ((n `quot` 2)+1)], n `rem` x == 0] + 2

--Generate a List of Triangular Values
triaList :: [Integer]
triaList =  [foldr (+) 0 [1..n] | n <- [1..]]

--The same recursive
triaList2 = go 0 1
  where go cs n = (cs+n):go (cs+n) (n+1)

--Finds the first triangular Value with more than n Divisors
sol :: Integer -> Integer
sol n = head $ filter (\x -> numDivs(x)>n) triaList2

Cette Solution pour n=500 (sol 500) est extrêmement lent (plus de 2 heures maintenant), donc je me demandais comment savoir pourquoi cette solution est si lent. Existe-il des commandes dites-moi où la plupart des calculs de temps est passé donc je sais quelle partie de mon haskell-le programme est-il lent? Quelque chose comme un simple générateur de profils.

Pour que ce soit clair, je ne demande pas pour une solution plus rapide mais pour un moyen pour trouver cette solution. Comment vous y prendriez vous si vous n'avez pas le haskell connaissances?

J'ai essayé d'écrire deux triaList fonctions mais n'a trouvé aucun moyen de tester celui qui est plus rapide, donc c'est là que mes problèmes de démarrage.

Grâce

InformationsquelleAutor theomega | 2010-07-18