有没有一种简单的方法来计算Haskell中函数执行的时间?
答案 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
对于我的非常简单的用例来说,这似乎很好用。