Haskell,测量函数的CPU时间

h--*_*--n 9 haskell lazy-evaluation

我需要测量一个函数的CPU时间,如下所示:

t <- getCPUTime
res <- callTheFunction input
t' <- getCPUTime
print $ t' - t
Run Code Online (Sandbox Code Playgroud)

问题来自Haskell的懒惰.必须严格评估callTheFunction.我搜索了很多,并尝试使用seq和$!但没有成功.我认为这应该是一项非常普遍的任务.无论如何,我需要一些帮助.谢谢.

更新: 感谢您的所有帮助,尤其是@FUZxxl.它让我想起WHNF(弱头标准形式)和标准形式之间的区别. Haskell/Laziness 有助于理解Haskell的惰性评估.

我需要的是再做一步评估.无论如何$!只要只需要WHNF,就可以评估两种工作:

t <- getCPUTime
res <- callTheFunction input
evaluate res  OR  return $! res
t' <- getCPUTime
print $ t' - t
Run Code Online (Sandbox Code Playgroud)

Tho*_*son 8

如果您是基准测试,那么您应该使用Criterion.否则使用NFData(rnf)和爆炸模式来强制评估.


fuz*_*fuz 7

使用evaluate :: a -> IO a来自的功能Control.Exception.当执行相应的IO动作时,它会评估其对WHNF的参数.你必须确保WHNF足以满足你的功能.