Skip to content

Commit cd1ec88

Browse files
committed
WIP
1 parent 9175f01 commit cd1ec88

File tree

1 file changed

+97
-49
lines changed

1 file changed

+97
-49
lines changed

benchmarks/FineGrained.hs

Lines changed: 97 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6579
bFromList :: Benchmark
6680
bFromList =
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?!
103127
bUnionOverlap :: [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

130164
bUnionEqual :: [Benchmark]
131165
bUnionEqual =
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

145183
bDifference :: 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

154192
bDifferenceDisjoint :: [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

161208
bDifferenceOverlap :: [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

168216
bDifferenceEqual :: [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

176224
bSetFromList :: Benchmark
177225
bSetFromList =

0 commit comments

Comments
 (0)