在Haskell中,使用在函数执行开始和结束时获得的时间戳是否正确测量性能?

时间:2018-04-30 00:42:39

标签: performance haskell

我想测量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

1 个答案:

答案 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如果您想获得可靠的结果,我绝对建议您使用。