1

我正在使用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. 用注释!似乎没有什么区别。

谢谢!

4

1 回答 1

4

你的问题不是懒惰的评估——它sleep不会在计算上浪费任何 CPU 时间,它只会让程序在给定的延迟期间暂停执行。TimeIt正确报告您的 IO 操作花费在计算上的时间也是如此。

而不是getCPUTime,您想要在您想要计时的动作之前和之后获得挂钟时间。试试看。getCurrentTime_Data.Time.Clock

于 2012-11-14T00:31:17.747 回答