@@ -62,6 +62,20 @@ env' size setup run =
6262 )
6363 (\ x -> bench (show size) (run x))
6464
65+ env'' ::
66+ (NFData env ) =>
67+ (Int -> IOGenM StdGen -> IO env ) ->
68+ (Int -> env -> Benchmark ) ->
69+ Int ->
70+ Benchmark
71+ env'' setup b size =
72+ env
73+ ( do
74+ gen <- newIOGenM defaultGen
75+ setup size gen
76+ )
77+ (b size)
78+
6579bFromList :: Benchmark
6680bFromList =
6781 bgroup
@@ -91,13 +105,23 @@ bUnionDisjoint =
91105 where
92106 run :: (Hashable a ) => (HashMap a Int , HashMap a Int ) -> Benchmarkable
93107 run = whnf (\ (as, bs) -> HM. union as bs)
94- setupBytes s gen = do
95- (trues, falses) <- Key.Bytes. genDisjoint s bytesLength gen
96- return (keysToMap trues, keysToMap falses)
97- setupInts s gen = do
98- ints <- genInts s gen
99- let (trues, falses) = Data.List. partition (flip testBit (31 :: Int )) ints
100- return (keysToMap trues, keysToMap falses)
108+ setupBytes = genBytesMapsDisjoint
109+ setupInts = genIntMapsDisjoint
110+
111+ genIntMapsDisjoint ::
112+ (StatefulGen g m ) =>
113+ Int -> g -> m (HashMap Int Int , HashMap Int Int )
114+ genIntMapsDisjoint s gen = do
115+ ints <- genInts s gen
116+ let (trues, falses) = Data.List. partition (flip testBit (31 :: Int )) ints
117+ return (keysToMap trues, keysToMap falses)
118+
119+ genBytesMapsDisjoint ::
120+ (StatefulGen g m ) =>
121+ Int -> g -> m (HashMap Bytes Int , HashMap Bytes Int )
122+ genBytesMapsDisjoint s gen = do
123+ (trues, falses) <- Key.Bytes. genDisjoint s bytesLength gen
124+ return (keysToMap trues, keysToMap falses)
101125
102126-- TODO: Separate benchmarks for overlap with pointer eq?!
103127bUnionOverlap :: [Benchmark ]
@@ -108,70 +132,94 @@ bUnionOverlap =
108132 where
109133 run :: (Hashable a ) => (HashMap a Int , HashMap a Int ) -> Benchmarkable
110134 run = whnf (\ (as, bs) -> HM. union as bs)
111- setupBytes s gen = do
112- (trues, falses) <- Key.Bytes. genDisjoint s bytesLength gen
113- let (a_sep, b_sep) = splitAt (s `div` 4 ) trues
114- return
115- ( keysToMap falses `HM.union` keysToMap a_sep,
116- keysToMap falses `HM.union` keysToMap b_sep
117- )
118- setupInts s gen = do
119- let s_overlap = s `div` 2
120- let s_a_sep = (s - s_overlap) `div` 2
121- let s_b_sep = s - s_overlap - s_a_sep
122- overlap <- genInts s_overlap gen
123- a_sep <- genInts s_a_sep gen
124- b_sep <- genInts s_b_sep gen
125- return
126- ( keysToMap overlap `HM.union` keysToMap a_sep,
127- keysToMap overlap `HM.union` keysToMap b_sep
128- )
135+ setupBytes = genBytesMapsOverlap
136+ setupInts = genIntMapsOverlap
137+
138+ genBytesMapsOverlap ::
139+ (StatefulGen g m ) =>
140+ Int -> g -> m (HashMap Bytes Int , HashMap Bytes Int )
141+ genBytesMapsOverlap s gen = do
142+ (trues, falses) <- Key.Bytes. genDisjoint s bytesLength gen
143+ let (a_sep, b_sep) = splitAt (s `div` 4 ) trues
144+ return
145+ ( keysToMap falses `HM.union` keysToMap a_sep,
146+ keysToMap falses `HM.union` keysToMap b_sep
147+ )
148+
149+ genIntMapsOverlap ::
150+ (StatefulGen g m ) =>
151+ Int -> g -> m (HashMap Int Int , HashMap Int Int )
152+ genIntMapsOverlap s gen = do
153+ let s_overlap = s `div` 2
154+ let s_a_sep = (s - s_overlap) `div` 2
155+ let s_b_sep = s - s_overlap - s_a_sep
156+ overlap <- genInts s_overlap gen
157+ a_sep <- genInts s_a_sep gen
158+ b_sep <- genInts s_b_sep gen
159+ return
160+ ( keysToMap overlap `HM.union` keysToMap a_sep,
161+ keysToMap overlap `HM.union` keysToMap b_sep
162+ )
129163
130164bUnionEqual :: [Benchmark ]
131165bUnionEqual =
132- [ bgroup " Bytes" [env' s setupBytes run | s <- defaultSizes],
133- bgroup " Int" [env' s setupInts run | s <- defaultSizes]
166+ [ bgroup " Bytes" [env' s genBytesMap run | s <- defaultSizes],
167+ bgroup " Int" [env' s genIntMap run | s <- defaultSizes]
134168 ]
135169 where
136170 run :: (Hashable a ) => HashMap a Int -> Benchmarkable
137171 run = whnf (\ m -> HM. union m m)
138- setupBytes s gen = do
139- ks <- Key.Bytes. genNBytes s bytesLength gen
140- return (keysToMap ks)
141- setupInts s gen = do
142- ks <- genInts s gen
143- return (keysToMap ks)
172+
173+ genBytesMap :: (StatefulGen g m ) => Int -> g -> m (HashMap Bytes Int )
174+ genBytesMap s gen = do
175+ ks <- Key.Bytes. genNBytes s bytesLength gen
176+ return (keysToMap ks)
177+
178+ genIntMap :: (StatefulGen g m ) => Int -> g -> m (HashMap Int Int )
179+ genIntMap s gen = do
180+ ks <- genInts s gen
181+ return (keysToMap ks)
144182
145183bDifference :: Benchmark
146- bDifference = bgroup " difference" []
147- {-
184+ bDifference =
185+ bgroup
186+ " difference"
148187 [ bgroup " disjoint" bDifferenceDisjoint,
149188 bgroup " overlap" bDifferenceOverlap,
150189 bgroup " equal" bDifferenceEqual
151190 ]
152- -}
153191
154192bDifferenceDisjoint :: [Benchmark ]
155- bDifferenceDisjoint = [ b " Bytes" setupBytes, b " Int" setupInts ]
193+ bDifferenceDisjoint =
194+ [ bgroup' " Bytes" genBytesMapsDisjoint b,
195+ bgroup' " Int" genIntMapsDisjoint b
196+ ]
156197 where
157- b = undefined
158- setupBytes = undefined
159- setupInts = undefined
198+ b size = bench (show size) . whnf (\ (xs, ys) -> HM. difference xs ys)
199+
200+ bgroup' ::
201+ (NFData env ) =>
202+ String ->
203+ (Int -> IOGenM StdGen -> IO env ) ->
204+ (Int -> env -> Benchmark ) ->
205+ Benchmark
206+ bgroup' name setup b = bgroup name [env'' setup b s | s <- defaultSizes]
160207
161208bDifferenceOverlap :: [Benchmark ]
162- bDifferenceOverlap = [ b " Bytes" setupBytes, b " Int" setupInts ]
209+ bDifferenceOverlap =
210+ [ bgroup' " Bytes" genBytesMapsOverlap b,
211+ bgroup' " Int" genIntMapsOverlap b
212+ ]
163213 where
164- b = undefined
165- setupBytes = undefined
166- setupInts = undefined
214+ b size = bench (show size) . whnf (\ (xs, ys) -> HM. difference xs ys)
167215
168216bDifferenceEqual :: [Benchmark ]
169- bDifferenceEqual = [ b " Bytes" setupBytes, b " Int" setupInts ]
217+ bDifferenceEqual =
218+ [ bgroup' " Bytes" genBytesMap b,
219+ bgroup' " Int" genIntMap b
220+ ]
170221 where
171- b = undefined
172- setupBytes = undefined
173- setupInts = undefined
174-
222+ b size = bench (show size) . whnf (\ m -> HM. difference m m)
175223
176224bSetFromList :: Benchmark
177225bSetFromList =
0 commit comments