@@ -9,7 +9,9 @@ module Main where
99
1010import Control.Monad (replicateM )
1111import Data.Bits (testBit )
12+ import Data.HashMap.Strict (HashMap )
1213import qualified Data.HashMap.Strict as HM
14+ import Data.Hashable
1315import Data.List
1416import Key.Bytes
1517import System.Random.Stateful
@@ -66,7 +68,26 @@ bUnion :: Benchmark
6668bUnion =
6769 bgroup
6870 " union"
69- [bgroup " disjoint" bUnionDisjoint, bgroup " overlap" bUnionOverlap, bgroup " same" [] ]
71+ [ bgroup " disjoint" bUnionDisjoint,
72+ bgroup " overlap" bUnionOverlap,
73+ bgroup " equal" bUnionEqual
74+ ]
75+
76+ bUnionEqual :: [Benchmark ]
77+ bUnionEqual =
78+ [ bgroup " Bytes" [env (bytesEnv s) (bench' s) | s <- defaultSizes],
79+ bgroup " Int" [env (intsEnv s) (bench' s) | s <- defaultSizes]
80+ ]
81+ where
82+ bench' s = bench (show s) . whnf (\ m -> HM. union m m)
83+ bytesEnv s = do
84+ g <- newIOGenM defaultGen
85+ ks <- Key.Bytes. genNBytes s bytesLength g
86+ return (toMap ks)
87+ intsEnv s = do
88+ g <- newIOGenM defaultGen
89+ ks <- genInts s g
90+ return (toMap ks)
7091
7192bUnionDisjoint :: [Benchmark ]
7293bUnionDisjoint =
@@ -88,14 +109,16 @@ bUnionDisjoint =
88109-- TODO: Separate benchmarks for overlap with pointer eq?!
89110bUnionOverlap :: [Benchmark ]
90111bUnionOverlap =
91- [ -- bgroup "Bytes" [env (bytesEnv s) (bench' s) | s <- defaultSizes],
112+ [ bgroup " Bytes" [env (bytesEnv s) (bench' s) | s <- defaultSizes],
92113 bgroup " Int" [env (intsEnv s) (bench' s) | s <- defaultSizes]
93114 ]
94115 where
95116 bench' s tup = bench (show s) $ whnf (\ (as, bs) -> HM. union as bs) tup
96117 bytesEnv s = do
97118 g <- newIOGenM defaultGen
98- undefined
119+ (trues, falses) <- Key.Bytes. genDisjoint s bytesLength g
120+ let (a_sep, b_sep) = splitAt (s `div` 4 ) trues
121+ return (toMap falses `HM.union` toMap a_sep, toMap falses `HM.union` toMap b_sep)
99122 intsEnv s = do
100123 g <- newIOGenM defaultGen
101124 let s_overlap = s `div` 2
@@ -104,9 +127,11 @@ bUnionOverlap =
104127 overlap <- genInts s_overlap g
105128 a_sep <- genInts s_a_sep g
106129 b_sep <- genInts s_b_sep g
107- let toMap = HM. fromList . map (,() )
108130 return (toMap overlap `HM.union` toMap a_sep, toMap overlap `HM.union` toMap b_sep)
109131
132+ toMap :: (Hashable k ) => [k ] -> HashMap k Int
133+ toMap = HM. fromList . map (,1 )
134+
110135genInts ::
111136 (StatefulGen g m ) =>
112137 Int ->
0 commit comments