我想测量Haskell函数的性能。该功能同时执行。
使用[[0, (1, 2), (2, 1), (3, 3)],
[(1, 4), (3, 'y'), ('x', 'y'), ('x', 'y')],
[(2, 1), (1, 'y'), ('x', 'y'), ('x', 'y')],
[(3, 1), ('x', 'y'), ('x', 'y'),('x', 'y')]]
函数返回的时间戳来衡量其性能是否正确?懒惰会影响测量吗?
我想将这些时间保存在日志中。我查看了一些日志库,但它们返回的时间并不像getCurrentTime
返回的时间戳那么精确。我在日志中使用XES格式。
我使用的代码是这样的:(我没有编译它)
getCurrentTime
答案 0 :(得分:5)
这取决于功能。有些价值观会立即获得所有信息,而其他价值观则会超出最高层"这是一个人为的例子:
example :: (Int, Int)
example = (1+1, head [ x | x <- [1..], x == 10^6 ])
如果你在ghci中加载它,你会看到(2,
打印出来,然后经过一段时间的延迟,打印出值1000000)
的剩余部分。如果你得到这样的值,那么函数将&#34;返回&#34; &#34;前&#34;已计算出昂贵的子值。但是你可以使用deepseq
来确保一直计算一个值,并且不会有任何子计算。
基准测试是微妙的,并且有很多方法可以做错(特别是在Haskell中)。幸运的是,我们有一个非常好的基准测试库criterion
(tutorial)如果您想获得可靠的结果,我绝对建议您使用。