寻找一种简单的方法来定时执行readProcess(无标准)

时间:2012-11-14 00:21:56

标签: haskell

我正在使用readProcess(来自System.Process包)执行ssh命令,我想计算执行所需的时间并将其与命令输出一起打印。

我知道可以用标准准确计时,但标准似乎花费时间进行大量设置和拆卸以及打印额外输出。我不打算运行完整的基准测试,只显示ssh命令运行了多长时间。

到目前为止,我已经尝试了System.TimeIt包,但结果不正确。例如,这应至少报告5秒钟(仅运行sleep 5):

>>> timeIt $ readProcess "sleep" ["5"] []
CPU time:   0.04s

以下是System.TimeIt在幕后所做的事情:

-- |Wrap an 'IO' computation so that it prints out the execution time.
timeIt :: IO a -> IO a
timeIt ioa = do
    (t, a) <- timeItT ioa
    printf "CPU time: %6.2fs\n" t
    return a

-- |Wrap an 'IO' computation so that it returns execution time is seconds as well as the     real value.
timeItT :: IO a -> IO (Double, a)
timeItT ioa = do
    t1 <- getCPUTime
    a <- ioa
    t2 <- getCPUTime
    let t :: Double
    t = fromIntegral (t2-t1) * 1e-12
    return (t, a)

看起来很简单,但我无法找到强制执行a <- ioa的方法。使用!进行注释似乎没有任何区别。

谢谢!

1 个答案:

答案 0 :(得分:4)

这里的问题不是懒惰的评估 - sleep不会浪费任何CPU时间来计算事物,只是让程序在给定的延迟期间暂停执行。因此TimeIt正确地报告了您的IO操作花费在计算上的时间。

而不是getCPUTime,您希望在您想要的时间之前和之后获得挂钟时间。在getCurrentTime中尝试Data.Time.Clock