1

readProcess(パッケージから) sshコマンドを実行しSystem.Processていますが、実行にかかる時間を計測し、コマンド出力と一緒に出力したいと思います。

これをcriteriaで正確に計時することは可能ですが、criteriaは、余分な出力を印刷するだけでなく、多くのセットアップとティアダウンを行うのに時間を費やしているようです。完全なベンチマークを実行するつもりはありません。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 に答える