haskell - 我的计时器总是返回 0

标签 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$!,但无济于事。我该怎么办?

运行示例:

*Main> timeit test
What is your name?
Haskell
Your name is Haskell.
0.0

最佳答案

这是我要工作的一些代码

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 日开始的秒数……然后进行比较,但这似乎是一个非常罕见的错误。但是,如果您正在编写安全着陆飞机的软件,请深入研究并解决此问题。 :)

关于haskell - 我的计时器总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20244185/

相关文章:

haskell - Haskell中的整数平方根函数

haskell - 如何将 Aeson 的解析器与 IO 一起使用

haskell - 为什么 haskell 同时保留 isAlpha 和 isLetter?

java - 在 Java 中处理延迟事件的最佳方法是什么

windows - 具有唯一 ID 的 SetTimer

haskell - 检查它是否是特定类型 - haskell

haskell - 我怎么能提前知道 cabal 将生成的可执行文件放在哪里?

c# - 为什么 Timer 没有属性,初始化后如何获取它的时间间隔?

Python、Raspberry pi,每10毫秒精确调用一次任务

java - 在CloseActivity 上停止 fragment 计时器