module Main (main) where import Data.GroupedList (Grouped) import qualified Data.GroupedList as G import Criterion.Main ( defaultMainWith, bgroup, bench, nf , Benchmarkable, Benchmark , defaultConfig ) import Criterion.Types (reportFile) sampleSize :: Int sampleSize = 2000 sampleSize2 :: Int sampleSize2 = div sampleSize 2 uniform :: Grouped Int {-# NOINLINE uniform #-} uniform = G.fromList $ replicate sampleSize 0 increasing :: Grouped Int {-# NOINLINE increasing #-} increasing = G.fromList [1 .. sampleSize] halfuniform :: Grouped Int {-# NOINLINE halfuniform #-} halfuniform = G.fromList $ replicate sampleSize2 0 ++ [1 .. sampleSize2] halfincreasing :: Grouped Int {-# NOINLINE halfincreasing #-} halfincreasing = G.fromList $ [1 .. sampleSize2] ++ replicate sampleSize2 0 interleaved :: Grouped Int {-# NOINLINE interleaved #-} interleaved = G.fromList $ concat $ zipWith (\x y -> [x,y]) (replicate sampleSize2 0) [1 .. sampleSize2] halflist :: Grouped Int {-# NOINLINE halflist #-} halflist = G.fromList [1 .. sampleSize2] benchGroup :: String -> (Grouped Int -> Benchmarkable) -> Benchmark benchGroup n f = bgroup n $ fmap (\(bn,xs) -> bench bn $ f xs) [ ("uniform", uniform) , ("increasing", increasing) , ("halfuniform", halfuniform) , ("halfincreasing" , halfincreasing) , ("interleaved", interleaved) ] main :: IO () main = defaultMainWith (defaultConfig { reportFile = Just "grouped-list-bench.html" }) [ benchGroup "map id" $ nf $ G.map id , benchGroup "map +1" $ nf $ G.map (+1) , benchGroup "map const" $ nf $ G.map (const True) , benchGroup "adjust 0/2" $ nf $ G.adjust (+1) 0 , benchGroup "adjust 1/2" $ nf $ G.adjust (+1) $ sampleSize2 + 1 , benchGroup "adjust 2/2" $ nf $ G.adjust (+1) $ sampleSize - 1 , bench "mappend" $ nf (\xs -> mappend xs xs) halflist , benchGroup "sort" $ nf G.sort , bench "fromList/uniform" $ nf G.fromList (replicate sampleSize (0 :: Int)) , bench "fromList/increasing" $ nf G.fromList [1..sampleSize] ]