2012-11-14 2 views
1

readProcess (System.Process 패키지에서) ssh 명령을 실행 중이며 실행 시간이 얼마나 걸리는지 시간을 기록하고 싶습니다. 명령 출력.readProcess (조건없이) 실행 시간을 측정하는 간단한 방법을 찾고

기준으로 정확하게 시간을 측정 할 수는 있지만 시간이 오래 걸리며 추가 출력물 인쇄뿐만 아니라 많은 설정과 분해가 필요합니다. 나는 전체 벤치 마크를 실행하지 않고 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

여기서의 문제는 게으른 평가가 아닙니다. 컴퓨터를 계산할 때 CPU 시간을 낭비하지 않는다는 것입니다. 주어진 지연 동안 프로그램을 일시 중지하게 만듭니다. 따라서 TimeIt은 IO 작업이 계산에 소비 한 시간을 정확하게보고합니다.

대신 getCPUTime 대신 시간을 할 작업 전후의 벽시계 시간을 가져오고 싶습니다. Data.Time.Clock에서 getCurrentTime을 시도해보십시오.

+0

고마워요! 그건 의미가 있습니다. '''getCurrentTime'''는 원하는 결과를 제공합니다. – jhickner

관련 문제