2011-03-21 52 views
9

的CPU时间,我需要测量功能的CPU时间就像如下:哈斯克尔,测量功能

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

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

更新: 感谢您的所有帮助,特别是@FUZxxl。它让我想起了WHNF(弱首标准形式)和正常形式之间的区别。 Haskell/Laziness 有助于理解Haskell的懒惰评估。

我需要的是一个更多的步骤评估。无论如何$!或评估两部作品,只要只需要RES WHNF:

t <- getCPUTime 
res <- callTheFunction input 
evaluate res OR return $! res 
t' <- getCPUTime 
print $ t' - t 
+1

这并没有解决你的严格性问题(使用评估),但对于快速和脏时间(即比标准更简单),你可以使用timeIt包:http://hackage.haskell。 org/package/timeit – sclv 2011-03-21 18:22:49

回答

7

使用来自Control.Exception功能evaluate :: a -> IO a。当相应的IO动作被执行时,它将它的参数评估为WHNF。你必须确保WHNF对于你的功能来说是足够的。

+0

请注意,WHNF通常是不够的。作为一个例子,列表的WHNF只是第一个缺点。 – 2011-03-21 22:03:10

+0

你可以结合评估和执行比。 – fuz 2011-03-22 08:39:45

4

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

8

如果你是基准测试,那么你应该使用Criterion。否则使用NFData(rnf)和bang patterns来强制评估。

+0

问题是,尤其是在IO环境中,'seq'和'rnf'通常不够强大,无法将表达式评估到所需的等级。 – fuz 2011-03-21 16:24:19

+0

@FUZxxl我不清楚你在做什么。如果你在任何时候(在IO操作之前或之后)有一个'NFData a => a'类型的值,那么bang模式和'rnf'应该是足够的(在许多情况下肯定比WHNF好)。 – 2011-03-21 17:00:35

+0

我刚刚读到这个。我很不自信。 – fuz 2011-03-21 17:03:35