to-1.1.0: bench/Main.hs
module Main (main) where
import qualified Data.Map.Lazy as ML
import qualified Data.IntMap.Lazy as IML
import qualified Data.Set as S
import qualified Data.IntSet as IS
import qualified Data.HashMap.Lazy as HML
import qualified Data.HashSet as HS
import Data.Text (Text, pack)
import Gauge
main :: IO ()
main = defaultMain
[ bgroup "IntMap->Map" intMapToMapBench
, bgroup "HashMap->Map" hashMapToMapBench
, bgroup "IntSet->Set" intSetToSetBench
, bgroup "HashSet->Set" hashSetToSetBench
]
----------------------------------------------------------------------------
-- IntMap->Map
----------------------------------------------------------------------------
intMapToMapBench :: [Benchmark]
intMapToMapBench =
[ bench "foldr" $
whnf (IML.foldrWithKey ML.insert mempty) sampleIntMap
, bench "foldl'" $
whnf (IML.foldlWithKey' (\m k v -> ML.insert k v m) mempty) sampleIntMap
, bench "list" $
whnf (ML.fromDistinctAscList . IML.toAscList) sampleIntMap
]
sampleIntMap :: IML.IntMap ()
sampleIntMap = IML.fromList [(i, ()) | i <- [1..1000 :: Int]]
----------------------------------------------------------------------------
-- HashMap->Map
----------------------------------------------------------------------------
hashMapToMapBench :: [Benchmark]
hashMapToMapBench =
[ -- There was a possibility that for 'Int' the list variant would be
-- faster because 'hash' is monotonic for 'Int', but the bencmarks
-- show it's not faster
bgroup "Int"
[ bench "foldr" $
whnf (HML.foldrWithKey ML.insert mempty) sampleHashMapInt
, bench "foldl'" $
whnf (HML.foldlWithKey' (\m k v -> ML.insert k v m) mempty) sampleHashMapInt
, bench "list" $
whnf (ML.fromList . HML.toList) sampleHashMapInt
]
, bgroup "Text"
[ bench "foldr" $
whnf (HML.foldrWithKey ML.insert mempty) sampleHashMapText
, bench "foldl'" $
whnf (HML.foldlWithKey' (\m k v -> ML.insert k v m) mempty) sampleHashMapText
, bench "list" $
whnf (ML.fromList . HML.toList) sampleHashMapText
]
]
sampleHashMapInt :: HML.HashMap Int ()
sampleHashMapInt = HML.fromList [(i, ()) | i <- [1..1000 :: Int]]
sampleHashMapText :: HML.HashMap Text ()
sampleHashMapText = HML.fromList [(pack (show i), ()) | i <- [1..1000 :: Int]]
----------------------------------------------------------------------------
-- IntSet->Set
----------------------------------------------------------------------------
intSetToSetBench :: [Benchmark]
intSetToSetBench =
[ bench "foldr" $
whnf (IS.foldr S.insert mempty) sampleIntSet
, bench "foldl'" $
whnf (IS.foldl' (flip S.insert) mempty) sampleIntSet
, bench "list" $
whnf (S.fromDistinctAscList . IS.toAscList) sampleIntSet
]
sampleIntSet :: IS.IntSet
sampleIntSet = IS.fromList [1..1000 :: Int]
----------------------------------------------------------------------------
-- HashSet->Set
----------------------------------------------------------------------------
hashSetToSetBench :: [Benchmark]
hashSetToSetBench =
[ bench "foldr" $
whnf (HS.foldr S.insert mempty) sampleHashSet
, bench "foldl'" $
whnf (HS.foldl' (flip S.insert) mempty) sampleHashSet
, bench "list" $
whnf (S.fromList . HS.toList) sampleHashSet
]
sampleHashSet :: HS.HashSet Text
sampleHashSet = HS.fromList [pack (show i) | i <- [1..1000 :: Int]]