我在haskell中创建了一个计时器。问题是,它总是返回0.我认为这是因为懒惰,但我不知道如何解决它。
import System.CPUTime
timeit::IO ()->IO (Float)
timeit io=do
start <-getCPUTime
action <-seq start io
end <-seq action getCPUTime
return $! (fromIntegral $ end-start)/(10**12)
正如你所看到的,我已经投入了seq
和$!
galor,但无济于事。我该怎么办?
这是一个示例运行:
*Main> timeit test
What is your name?
Haskell
Your name is Haskell.
0.0
答案 0 :(得分:4)
这是我开始工作的一些代码
import Data.Time.Clock
timeit::IO ()->IO NominalDiffTime
timeit doit=do
start <- getCurrentTime
doit
end <- getCurrentTime
return (diffUTCTime end start)
现在进行一些讨论 -
从评论看来,你似乎想要实时,而不是cpu时间,所以这就是我写的。
不推荐使用System.Time库,因此我将您切换到Data.Time库。
NominalDiffTime以秒为单位保存时间....
NominalDiffTime忽略闰秒!万一在程序运行期间添加闰秒,10秒延迟将显示为11秒。我搜索了如何解决这个问题,虽然Data.Time确实有一个DiffTime类型来解决这个问题,但似乎没有一种简单的方法可以从UTCTime生成DiffTime。我想你可能能够使用Posix时间库并从1970年1月1日开始获得秒数....然后采取差异,但这似乎很难得到一个非常罕见的bug。如果您正在编写安全着陆飞机的软件,请深入挖掘并解决此问题。 :)
答案 1 :(得分:0)
我之前使用过它,它适用于近似值。不要非常精确地依赖它,但它应该在一毫秒内准确。我从未测试过它的准确性,所以使用风险自负
import System.CPUTime
timeit :: IO a -> IO (a, Integer)
timeit action = do
start <- getCPUTime
value <- action
end <- getCPUTime
return (value, end - start)
不需要明确的严格性。