{-# LANGUAGE BangPatterns #-} module BasicBench where import Control.Monad.Random import qualified Data.Vector.Primitive as V import qualified Data.Vector as VV import Data.RangeMin.Fusion (replicateM) import Data.RangeMin.Cartesian import Criterion.Main import Criterion.Config import Data.RangeMin import Data.Char n :: Int n = 1000000 {-# NOINLINE performRM #-} performRM :: V.Vector Int -> Int performRM ys = unsafeIntRangeMin ys 0 1 performRMC :: V.Vector Char -> Int performRMC ys = unsafeVecRangeMin ys 0 1 performRMI :: VV.Vector Integer -> Int performRMI ys = unsafeVecRangeMin ys 0 1 performRMI' :: VV.Vector Integer -> Int performRMI' ys = unsafeInjectRangeMin fromIntegral ys 0 1 bencher :: Int -> IO Benchmark bencher n = do !xs <- replicateM n getRandom V.foldr seq (return (bench (show n) (whnf performRM xs))) xs main :: IO () main = do benches <- mapM bencher [1000000] defaultMainWith defaultConfig{cfgPerformGC = ljust True} (return ()) benches