{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -O2 #-}
import Gauge.Main
import System.Random (randoms,mkStdGen)
import Data.Foldable (foldMap)
import Data.Maybe (fromMaybe)
import Data.Bool (bool)
import qualified GHC.Exts as E
import qualified Data.Set.Unboxed as DSU
import qualified Data.Set.Lifted as DSL
import qualified Data.Map.Unboxed.Unboxed as DMUU
import qualified Data.Map.Lifted.Lifted as DMLL
import qualified Data.Map.Strict as M
import qualified Data.IntMap.Strict as IM
import qualified Data.Set as S
main :: IO ()
main = defaultMain
[ bgroup "Map"
[ bgroup "lookup"
[ bench "primitive-unboxed-unboxed" $ whnf lookupAllUnboxed bigUnboxedMap
, bench "containers-map" $ whnf lookupAllContainers bigContainersMap
, bench "containers-intmap" $ whnf lookupAllIntContainers bigContainersIntMap
]
, bgroup "fold"
[ bench "primitive-unboxed-unboxed" $ whnf (DMUU.foldlWithKey' reduction 0) bigUnboxedMap
, bench "primitive-lifted-lifted" $ whnf (DMLL.foldlWithKey' reduction 0) bigLiftedMap
, bench "containers-map" $ whnf (M.foldlWithKey' reduction 0) bigContainersMap
]
]
, bgroup "Set"
[ bgroup "lookup"
[ bench "primitive-unboxed" $ whnf lookupAllSetUnboxed bigUnboxedSet
, bench "primitive-lifted" $ whnf lookupAllSetLifted bigLiftedSet
]
, bgroup "fold"
[ bench "primitive-unboxed" $ whnf (DSU.foldl' (+) 0) bigUnboxedSet
, bench "containers-set" $ whnf (S.foldl' (+) 0) bigContainersSet
]
, bgroup "concat"
[ bgroup "fold"
[ bench "20" $ whnf (foldMap DSU.singleton) randomArray20
, bench "200" $ whnf (foldMap DSU.singleton) randomArray200
, bench "2000" $ whnf (foldMap DSU.singleton) randomArray2000
]
, bgroup "fromList"
[ bench "20" $ whnf (E.fromList :: [Word] -> DSU.Set Word) randomArray20
, bench "200" $ whnf (E.fromList :: [Word] -> DSU.Set Word) randomArray200
, bench "2000" $ whnf (E.fromList :: [Word] -> DSU.Set Word) randomArray2000
]
, bgroup "fromAscList"
[ bench "20" $ whnf (E.fromList :: [Word] -> DSU.Set Word) ascArray20
, bench "200" $ whnf (E.fromList :: [Word] -> DSU.Set Word) ascArray200
, bench "2000" $ whnf (E.fromList :: [Word] -> DSU.Set Word) ascArray2000
]
]
]
]
reduction :: Int -> Int -> Int -> Int
reduction x y z = x + y + z
bigNumber :: Int
bigNumber = 100000
bigContainersSet :: S.Set Int
bigContainersSet = E.fromList (map (\x -> x `mod` (bigNumber * 2)) (take bigNumber (randoms (mkStdGen 75843))))
bigUnboxedSet :: DSU.Set Int
bigUnboxedSet = E.fromList (map (\x -> x `mod` (bigNumber * 2)) (take bigNumber (randoms (mkStdGen 75843))))
bigLiftedSet :: DSL.Set Int
bigLiftedSet = E.fromList (map (\x -> x `mod` (bigNumber * 2)) (take bigNumber (randoms (mkStdGen 75843))))
bigUnboxedMap :: DMUU.Map Int Int
bigUnboxedMap = E.fromList (map (\x -> (x `mod` (bigNumber * 2),x)) (take bigNumber (randoms (mkStdGen 75843))))
bigLiftedMap :: DMLL.Map Int Int
bigLiftedMap = E.fromList (map (\x -> (x `mod` (bigNumber * 2),x)) (take bigNumber (randoms (mkStdGen 75843))))
bigContainersMap :: M.Map Int Int
bigContainersMap = M.fromList (map (\x -> (x `mod` (bigNumber * 2),x)) (take bigNumber (randoms (mkStdGen 75843))))
bigContainersIntMap :: IM.IntMap Int
bigContainersIntMap = IM.fromList (map (\x -> (x `mod` (bigNumber * 2),x)) (take bigNumber (randoms (mkStdGen 75843))))
lookupAllUnboxed :: DMUU.Map Int Int -> Int
lookupAllUnboxed m = go 0 0 where
go !acc !n = if n < bigNumber
then go (acc + fromMaybe 0 (DMUU.lookup n m)) (n + 1)
else acc
lookupAllSetUnboxed :: DSU.Set Int -> Int
lookupAllSetUnboxed m = go 0 0 where
go !acc !n = if n < bigNumber
then go (acc + bool 2 3 (DSU.member n m)) (n + 1)
else acc
lookupAllSetLifted :: DSL.Set Int -> Int
lookupAllSetLifted m = go 0 0 where
go !acc !n = if n < bigNumber
then go (acc + bool 2 3 (DSL.member n m)) (n + 1)
else acc
lookupAllContainers :: M.Map Int Int -> Int
lookupAllContainers m = go 0 0 where
go !acc !n = if n < bigNumber
then go (acc + fromMaybe 0 (M.lookup n m)) (n + 1)
else acc
lookupAllIntContainers :: IM.IntMap Int -> Int
lookupAllIntContainers m = go 0 0 where
go !acc !n = if n < bigNumber
then go (acc + fromMaybe 0 (IM.lookup n m)) (n + 1)
else acc
ascArray20 :: [Word]
ascArray20 = take 20 (enumFrom 0)
ascArray200 :: [Word]
ascArray200 = take 200 (enumFrom 0)
ascArray2000 :: [Word]
ascArray2000 = take 2000 (enumFrom 0)
randomArray20 :: [Word]
randomArray20 = take 20 (randoms (mkStdGen 75843))
randomArray200 :: [Word]
randomArray200 = take 200 (randoms (mkStdGen 75843))
randomArray2000 :: [Word]
randomArray2000 = take 2000 (randoms (mkStdGen 75843))