9
votes

Haskell, mesure le temps de la CPU d'une fonction

J'ai besoin de mesurer la durée de la CPU d'une fonction comme suit: xxx pré>

Le problème vient de la paresse de Haskell. Callthefunction doit être strictement évaluée. J'ai beaucoup cherché et j'ai essayé d'utiliser SEQ et $! mais sans succès. Je pense que cela devrait être une tâche assez courante. Quoi qu'il en soit, j'ai besoin d'aide. Merci. P>

mise à jour: strong> Merci pour toute l'aide, surtout @fuzxxl. Cela me rappelle la différence entre WHNF (forme de tête faible) et forme normale. haskell / paresse Aide à comprendre l'évaluation paresseuse de Haskell. P>

Ce dont j'avais besoin est une évaluation de plus de pas. En tout cas $! ou évaluer les deux œuvres tant que ce que WHNF soit nécessaire pour RES: P>

t <- getCPUTime
res <- callTheFunction input
evaluate res  OR  return $! res
t' <- getCPUTime
print $ t' - t


1 commentaires

Cela ne corrige pas le problème de votre strictisme (utilisation d'utilisation pour cela) mais pour les horaires rapides et sales (c'est-à-dire plus simple que le critère), vous pouvez simplement utiliser le package TIMITE: Hackage.hakell.org/package/timev


3 Réponses :


7
votes

Utilisez la fonction évaluer :: a -> io a à partir de contrôler.Exception . Il évalue son argument à WHNF lorsque l'IO-Action correspondante est exécutée. Vous devez vous assurer que WHNF est suffisant pour votre fonction.


2 commentaires

Notez que WHNF n'est souvent pas suffisant. À titre d'exemple, WHNF d'une liste n'est que le premier inconvénient.


Vous pouvez combiner évaluer et appliquer que.



4
votes

Si vous essayez de faire des points de repère, utilisez l'excellent critère bibliothèque, qui est sur Hackage.


0 commentaires