我需要测量以下函数的CPU时间:
t <- getCPUTime
res <- callTheFunction input
t' <- getCPUTime
print $ t' - t
问题来自Haskell的懒惰。必须严格评估callTheFunction。我搜索了很多,并尝试使用seq和$!但没有成功。我认为这应该是一项非常普遍的任务。无论如何,我需要一些帮助。感谢。
更新 感谢所有的帮助,特别是@FUZxxl。它让我想起WHNF(弱头普通形式)和普通形式之间的区别。 Haskell/Laziness 帮助理解Haskell的懒惰评估。
我需要的是再做一步评估。无论如何$!只要Res:
只需要WHNF,就可以评估两种作品t <- getCPUTime
res <- callTheFunction input
evaluate res OR return $! res
t' <- getCPUTime
print $ t' - t
答案 0 :(得分:8)
如果您是基准测试,则应使用Criterion。否则,请使用NFData(rnf)和bang patterns强制进行评估。
答案 1 :(得分:7)
使用evaluate :: a -> IO a
中的Control.Exception
功能。当执行相应的IO动作时,它会评估其对WHNF的参数。你必须确保WHNF足以满足你的功能。
答案 2 :(得分:4)
如果您正在尝试做基准测试,请使用Hackage上的优秀标准库。