{-# LINE 1 "libraries\base\.\System\CPUTime.hsc" #-} ----------------------------------------------------------------------------- {-# LINE 2 "libraries\base\.\System\CPUTime.hsc" #-} -- | -- Module : System.CPUTime -- Copyright : (c) The University of Glasgow 2001 -- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : portable -- -- The standard CPUTime library. -- ----------------------------------------------------------------------------- module System.CPUTime ( getCPUTime, -- :: IO Integer cpuTimePrecision -- :: Integer ) where import Prelude import Data.Ratio {-# LINE 28 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 32 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 34 "libraries\base\.\System\CPUTime.hsc" #-} import Foreign hiding (unsafePerformIO) import Foreign.C {-# LINE 39 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 41 "libraries\base\.\System\CPUTime.hsc" #-} -- For _SC_CLK_TCK {-# LINE 44 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 45 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 46 "libraries\base\.\System\CPUTime.hsc" #-} -- For struct rusage {-# LINE 53 "libraries\base\.\System\CPUTime.hsc" #-} -- For FILETIME etc. on Windows {-# LINE 56 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 57 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 58 "libraries\base\.\System\CPUTime.hsc" #-} -- for CLK_TCK {-# LINE 61 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 62 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 63 "libraries\base\.\System\CPUTime.hsc" #-} -- for struct tms {-# LINE 68 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 70 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 77 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 79 "libraries\base\.\System\CPUTime.hsc" #-} -- ----------------------------------------------------------------------------- -- |Computation 'getCPUTime' returns the number of picoseconds CPU time -- used by the current program. The precision of this result is -- implementation-dependent. getCPUTime :: IO Integer getCPUTime = do {-# LINE 131 "libraries\base\.\System\CPUTime.hsc" #-} -- NOTE: GetProcessTimes() is only supported on NT-based OSes. -- The counts reported by GetProcessTimes() are in 100-ns (10^-7) units. allocaBytes (8) $ \ p_creationTime -> do {-# LINE 134 "libraries\base\.\System\CPUTime.hsc" #-} allocaBytes (8) $ \ p_exitTime -> do {-# LINE 135 "libraries\base\.\System\CPUTime.hsc" #-} allocaBytes (8) $ \ p_kernelTime -> do {-# LINE 136 "libraries\base\.\System\CPUTime.hsc" #-} allocaBytes (8) $ \ p_userTime -> do {-# LINE 137 "libraries\base\.\System\CPUTime.hsc" #-} pid <- getCurrentProcess ok <- getProcessTimes pid p_creationTime p_exitTime p_kernelTime p_userTime if toBool ok then do ut <- ft2psecs p_userTime kt <- ft2psecs p_kernelTime return (ut + kt) else return 0 where ft2psecs :: Ptr FILETIME -> IO Integer ft2psecs ft = do high <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ft :: IO Word32 {-# LINE 148 "libraries\base\.\System\CPUTime.hsc" #-} low <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ft :: IO Word32 {-# LINE 149 "libraries\base\.\System\CPUTime.hsc" #-} -- Convert 100-ns units to picosecs (10^-12) -- => multiply by 10^5. return (((fromIntegral high) * (2^(32::Int)) + (fromIntegral low)) * 100000) -- ToDo: pin down elapsed times to just the OS thread(s) that -- are evaluating/managing Haskell code. type FILETIME = () type HANDLE = () -- need proper Haskell names (initial lower-case character) foreign import stdcall unsafe "GetCurrentProcess" getCurrentProcess :: IO (Ptr HANDLE) foreign import stdcall unsafe "GetProcessTimes" getProcessTimes :: Ptr HANDLE -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> IO CInt {-# LINE 163 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 164 "libraries\base\.\System\CPUTime.hsc" #-} -- |The 'cpuTimePrecision' constant is the smallest measurable difference -- in CPU time that the implementation can record, and is given as an -- integral number of picoseconds. {-# LINE 170 "libraries\base\.\System\CPUTime.hsc" #-} cpuTimePrecision :: Integer cpuTimePrecision = round ((1000000000000::Integer) % fromIntegral (clockTicks)) {-# LINE 173 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 175 "libraries\base\.\System\CPUTime.hsc" #-} clockTicks :: Int clockTicks = {-# LINE 178 "libraries\base\.\System\CPUTime.hsc" #-} (1000) {-# LINE 179 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 183 "libraries\base\.\System\CPUTime.hsc" #-} {-# LINE 184 "libraries\base\.\System\CPUTime.hsc" #-}