Haskell函数执行时间

时间:2011-07-20 18:11:44

标签: haskell

有没有一种简单的方法来计算Haskell中函数执行的时间?

6 个答案:

答案 0 :(得分:92)

最简单的事情就是在:set +s中执行ghci,然后您可以看到运行的任何内容的执行时间以及内存使用情况。

答案 1 :(得分:27)

criterion package专门用来做这件事。

答案 2 :(得分:10)

查看http://hackage.haskell.org/package/timeit是否符合您的需求。

答案 3 :(得分:6)

功能执行时间基准包含在Criterion.Measurement

例如,如果我想捕获someIOFunction :: IO ()

的时间
import Criterion.Measurement
main = secs <$> time_ someIOFunction >>= print

答案 4 :(得分:2)

Criterion是最复杂的方法,虽然我发现很难开始,但似乎是针对基准程序。我想计算执行的时间并在我的程序中使用这些数据,但似乎并没有解决这个问题,至少它并不是很明显。

TimeIt非常简单并且做我想要的,除了它不能很好地处理纯函数。纯函数返回的时间是thunk分配时间(AFAIK),即使使用seq,也很难得到你想要的东西。

对我有用的是基于TimeIt。

import System.TimeIt

timeItTPure :: (a -> ()) -> a -> IO (Double,a)
timeItTPure p a = timeItT $ p a `seq` return a

在timeItTPure p a中,p是负责评估纯计算结果的函数,a,以及获得良好评估时序所需的深度。也许这是一个简单的模式匹配,也许它是计算列表的长度,也许它是seq列表中的每个元素,也许是一个深层次的等等。

使用seq很棘手。注意,以下功能无法按预期执行。哈斯克尔是一件神秘的事。

badTimeItTPure a = timeItT . return $ seq (p a) a

答案 5 :(得分:0)

https://github.com/chrissound/FuckItTimer

start' <- start
timerc start' "begin"
print "hello"
timerc start' "after printing hello"
benchmark
timerc start' "end"
end <- getVals start'
forM_ (timert end) putStrLn

输出:

"hello"
begin -> after printing hello: 0.000039555s
after printing hello -> end: 1.333936928s

对于我的非常简单的用例来说,这似乎很好用。