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
Use the function
evaluate :: a -> IO afromControl.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.