我正在使用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
的方法。使用!
进行注释似乎没有任何区别。
谢谢!
答案 0 :(得分:4)
这里的问题不是懒惰的评估 - sleep
不会浪费任何CPU时间来计算事物,只是让程序在给定的延迟期间暂停执行。因此TimeIt
正确地报告了您的IO操作花费在计算上的时间。
而不是getCPUTime
,您希望在您想要的时间之前和之后获得挂钟时间。在getCurrentTime
中尝试Data.Time.Clock
。