Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell, Measuring CPU time of a function

I need to measure CPU time of a function like following:

t <- getCPUTime
res <- callTheFunction input
t' <- getCPUTime
print $ t' - t

The problem comes from the laziness of Haskell. callTheFunction must be strictly evaluated. I've searched a lot and tried to use seq and $! but without success. I think this should be a quite common task. Anyway, I need some help. Thanks.

Update: Thanks for all the help, especially @FUZxxl. It reminds me the difference between WHNF (Weak Head Normal Form) and Normal Form. Haskell/Laziness helps understand the lazy evaluation of Haskell.

What I needed is one more step evaluation. Anyway $! or evaluate both works as long as only WHNF is needed for res:

t <- getCPUTime
res <- callTheFunction input
evaluate res  OR  return $! res
t' <- getCPUTime
print $ t' - t
like image 265
h--n Avatar asked Mar 21 '11 14:03

h--n


2 Answers

If you're benchmarking then you should use Criterion. Otherwise use NFData (rnf) and bang patterns to force evaluation.

like image 81
Thomas M. DuBuisson Avatar answered Sep 28 '22 06:09

Thomas M. DuBuisson


Use the function evaluate :: a -> IO a from Control.Exception. It evaluates its argument to WHNF when the corresponding IO-action is executed. You have to make sure that WHNF is sufficient for your function though.

like image 35
fuz Avatar answered Sep 28 '22 06:09

fuz