module Data.Array.Repa.IO.Timing
( Time
, milliseconds
, microseconds
, cpuTime, wallTime
, time, minus, plus
, showTime
, prettyTime)
where
import System.CPUTime
import System.Time
data Time
= Time
{ cpu_time :: Integer
, wall_time :: Integer
}
zipT :: (Integer -> Integer -> Integer) -> Time -> Time -> Time
zipT f (Time cpu1 wall1) (Time cpu2 wall2)
= Time (f cpu1 cpu2) (f wall1 wall2)
minus :: Time -> Time -> Time
minus = zipT ()
plus :: Time -> Time -> Time
plus = zipT (+)
type TimeUnit
= Integer -> Integer
microseconds :: TimeUnit
microseconds n = n `div` 1000000
milliseconds :: TimeUnit
milliseconds n = n `div` 1000000000
cpuTime :: TimeUnit -> Time -> Integer
cpuTime f = f . cpu_time
wallTime :: TimeUnit -> Time -> Integer
wallTime f = f . wall_time
getTime :: IO Time
getTime =
do
cpu <- getCPUTime
TOD sec pico <- getClockTime
return $ Time cpu (pico + sec * 1000000000000)
showTime :: Time -> String
showTime t = (show $ wallTime milliseconds t)
++ "/"
++ (show $ cpuTime milliseconds t)
prettyTime :: Time -> String
prettyTime t
= unlines
[ "elapsedTimeMS = " ++ (show $ wallTime milliseconds t)
, "cpuTimeMS = " ++ (show $ cpuTime milliseconds t) ]
time :: IO a -> IO (a, Time)
time p = do
start <- getTime
x <- p
end <- getTime
return (x, end `minus` start)