我的计时器总是返回0

时间:2013-11-27 13:47:00

标签: haskell timer

我在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

2 个答案:

答案 0 :(得分:4)

这是我开始工作的一些代码

import Data.Time.Clock

timeit::IO ()->IO NominalDiffTime
timeit doit=do
    start  <- getCurrentTime
    doit
    end    <- getCurrentTime
    return (diffUTCTime end start)

现在进行一些讨论 -

  1. 从评论看来,你似乎想要实时,而不是cpu时间,所以这就是我写的。

  2. 不推荐使用System.Time库,因此我将您切换到Data.Time库。

  3. NominalDiffTime以秒为单位保存时间....

  4. 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)

不需要明确的严格性。