module BuildBox.Benchmark.TimeAspect
( TimeAspect(..)
, takeTimeAspectOfBenchRunResult
, takeAvgTimeOfBenchResult
, takeMinTimeOfBenchResult
, takeMaxTimeOfBenchResult
, takeMinAvgMaxOfBenchResult)
where
import BuildBox.Benchmark.Base
import BuildBox.Pretty
import Control.Monad
data TimeAspect
= TimeAspectElapsed
| TimeAspectKernelElapsed
| TimeAspectKernelCpu
| TimeAspectKernelSys
deriving (Show, Read, Enum)
instance Pretty TimeAspect where
ppr aspect
= case aspect of
TimeAspectElapsed -> ppr "elapsed"
TimeAspectKernelElapsed -> ppr "k.elapsed"
TimeAspectKernelCpu -> ppr "k.cpu"
TimeAspectKernelSys -> ppr "k.system"
takeTimeAspectOfBenchRunResult :: TimeAspect -> BenchRunResult -> Maybe Float
takeTimeAspectOfBenchRunResult aspect result
= case aspect of
TimeAspectElapsed -> Just $ benchRunResultElapsed result
TimeAspectKernelElapsed -> join $ liftM timingElapsed $ benchRunResultKernel result
TimeAspectKernelCpu -> join $ liftM timingCpu $ benchRunResultKernel result
TimeAspectKernelSys -> join $ liftM timingSys $ benchRunResultKernel result
takeAvgTimeOfBenchResult :: TimeAspect -> BenchResult -> Maybe Float
takeAvgTimeOfBenchResult aspect result
= let mTimes = sequence
$ map (takeTimeAspectOfBenchRunResult aspect)
$ benchResultRuns result
in liftM (\ts -> sum ts / (fromIntegral $ length ts)) mTimes
takeMinTimeOfBenchResult :: TimeAspect -> BenchResult -> Maybe Float
takeMinTimeOfBenchResult aspect result
= let mTimes = sequence
$ map (takeTimeAspectOfBenchRunResult aspect)
$ benchResultRuns result
in liftM (\ts -> minimum ts) mTimes
takeMaxTimeOfBenchResult :: TimeAspect -> BenchResult -> Maybe Float
takeMaxTimeOfBenchResult aspect result
= let mTimes = sequence
$ map (takeTimeAspectOfBenchRunResult aspect)
$ benchResultRuns result
in liftM (\ts -> maximum ts) mTimes
takeMinAvgMaxOfBenchResult :: TimeAspect -> BenchResult -> Maybe (Float, Float, Float)
takeMinAvgMaxOfBenchResult aspect result
| Just tmin <- takeMinTimeOfBenchResult aspect result
, Just tavg <- takeAvgTimeOfBenchResult aspect result
, Just tmax <- takeMaxTimeOfBenchResult aspect result
= Just (tmin, tavg, tmax)
| otherwise
= Nothing