Temps d’exécution de la fonction Haskell

Existe-t-il une méthode simple pour calculer le temps d’exécution d’une fonction dans Haskell?

Les choses les plus simples sont de simplement faire :set +s dans ghci , puis vous pouvez voir le temps d’exécution de tout ce que vous exécutez, ainsi que l’utilisation de la mémoire.

Le paquet de criterion été spécialement conçu pour le faire correctement.

Voir si http://hackage.haskell.org/package/timeit correspond à vos besoins.

Le benchmark du temps d’exécution de la fonction est inclus dans Criterion.Measurement

par exemple, si je veux capturer l’heure de someIOFunction :: IO ()

 import Criterion.Measurement main = secs <$> time_ someIOFunction >>= print 

Le critère est la méthode la plus sophistiquée, même si j’ai eu du mal à le démarrer et semble cibler les programmes d’parsing comparative. Je voulais calculer le temps d’exécution et utiliser ces données dans mon programme et cela ne semble pas répondre à ce besoin, du moins pas immédiatement.

TimeIt est très simple et fait ce que je voulais, sauf qu’il ne gère pas bien les fonctions pures. Le temps retourné pour une fonction pure est le temps d’allocation thunk (AFAIK) et même avec l’utilisation de seq, il peut être difficile d’obtenir ce que vous voulez.

Ce qui fonctionne pour moi est basé sur TimeIt.

 import System.TimeIt timeItTPure :: (a -> ()) -> a -> IO (Double,a) timeItTPure pa = timeItT $ pa `seq` return a 

Dans TimeItTPure pa, p est la fonction chargée d’évaluer le résultat d’un calcul pur, a, aussi profondément que nécessaire pour obtenir le bon timing d’évaluation. Peut-être est-ce une simple correspondance de modèle, peut-être que cela compte la longueur d’une liste, peut-être sa seq chaque élément de la liste, peut-être un deepseq, etc.

L’utilisation de seq est délicate. Notez que la fonction ci-dessous ne fonctionne pas comme souhaité. Haskell est une chose mystérieuse.

 badTimeItTPure a = timeItT . return $ seq (pa) a