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

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.


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


如果您正在尝试做基准测试,请使用Hackage上的优秀标准库。

链接地址: http://www.djcxy.com/p/7438.html

上一篇: 严格和懒惰不同?

下一篇: Haskell,测量函数的CPU时间