J'ai besoin de mesurer la durée de la CPU d'une fonction comme suit: 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> 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
3 Réponses :
Utilisez la fonction évaluer :: a -> io a code> à partir de
contrôler.Exception code>. 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. P>
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.
Si vous essayez de faire des points de repère, utilisez l'excellent critère bibliothèque, qui est sur Hackage. P>
Si vous êtes comparatif, vous devez utiliser critère . Sinon, utilisez NFDATA A> (RNF) et Bang Modèles a > forcer l'évaluation. P>
Le problème est que, surtout dans un contexte IO, SEQ code> et
RNF code> ne sont souvent pas assez forts pour évaluer l'expression à la note souhaitée.
@Fuzxxl Je ne suis pas clair sur ce que vous obtenez. Si vous à un moment quelconque (avant ou après l'opération IO) a une valeur de type nfdata a => A code> puis de panneaux et
rnf code> devrait être suffisant (certainement mieux que WHNF pour de nombreux cas).
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