首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寻找一种简单的方法来计算readProcess的执行时间(没有标准)

寻找一种简单的方法来计算readProcess的执行时间(没有标准)
EN

Stack Overflow用户
提问于 2012-11-14 08:21:56
回答 1查看 98关注 0票数 1

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

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

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

代码语言:javascript
运行
复制
>>> timeIt $ readProcess "sleep" ["5"] []
CPU time:   0.04s

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

代码语言:javascript
运行
复制
-- |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的方法。使用!进行注释似乎没有什么不同。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-14 08:31:18

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13371207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档