packages feed

tasty-bench-fit-0.1.1: src/Test/Tasty/Bench/Utils.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}

module Test.Tasty.Bench.Utils (
  Measurement (..),
  measRelStDev,
  measure,
  traceShowM',
) where

import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import Test.Tasty (Timeout)
import Test.Tasty.Bench (Benchmarkable, RelStDev (..), measureCpuTimeAndStDev)
import Text.Printf (printf)

#ifdef DEBUG
import Debug.Trace
#endif

-- | Represents a time measurement for a given problem's size.
data Measurement = Measurement
  { measTime :: !Double
  , measStDev :: !Double
  }
  deriving (Eq, Ord, Generic)

instance Show Measurement where
  show (Measurement t err) = printf "%.3g ± %.3g" t err

instance NFData Measurement

measure :: Timeout -> RelStDev -> Benchmarkable -> IO Measurement
measure x y z = uncurry Measurement <$> measureCpuTimeAndStDev x y z

measRelStDev :: Measurement -> RelStDev
measRelStDev (Measurement mean stDev) = RelStDev (stDev / mean)

traceShowM' :: (Applicative m, Show a) => a -> m ()
#ifdef DEBUG
traceShowM' = traceShowM
#else
traceShowM' = const (pure ())
#endif