2012-11-02 64 views
1

我有几个函数,主要是输出信息。评估任何函数(... - > IO())函数

我需要来测量它们的执行时间。

目前,它的完成这样的:

start <- getCurrentTime 
    putStrLn $ show $ findNthMinLinear (getTestArrayOfLength (read arrlength :: Int)) 4 
    stop <- getCurrentTime 
    print $ diffUTCTime stop start 

我想包装每个功能的函数1.记住时间2.计算函数3.经历了两场想起倍

之间的时间4.打印的区别

问题是我不知道如何传递一个函数没有先评估它。

我的猜测是,如果我写的(< 5)为例,这是我创建了返回功能,没有真正的工作会做一个函数,直到我通过最后一个参数我猜? 然后,我可以写

printAndMeasure :: (a -> IO()) -> IO() 
... 
printAndMeasure \x -> (getTestArrayOfLength (read arrlength :: Int)) 4 

但它是一个草率的解决方案,因为我并不真的需要这个X以外的其他被执行保持功能。

+2

您应该使用[Criterion](http://hackage.haskell.org/packages/archive/criterion/latest/doc/html/Criterion-Main.html)进行基准测试。 – kennytm

+2

是什么让你觉得通过函数来​​评估它?这不会发生在使用一流功能的语言中,当然也不是懒惰的Haskell。无论如何,你甚至不谈论这里的函数,而是关于_monadic'IO' actions_。 – leftaroundabout

回答

6

传递一个函数不会评估它。所以你可以像IO() -> IO()这样的功能,并通过IO行动给他们。仅在程序运行时main函数被执行并且函数的参数在需要之前不会被评估(懒惰)。 如果您试图对您的代码进行基准测试,那么最好使用基准测试库,如Criterion