Skip to content

Commit 8c47ec9

Browse files
committed
Add random insert and delete benchmarks
1 parent d2a508a commit 8c47ec9

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

containers-tests/benchmarks/Map.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ import Data.Maybe (fromMaybe)
1515
import Data.Functor ((<$))
1616
import Data.Coerce
1717
import Prelude hiding (lookup)
18+
import System.Random (mkStdGen)
19+
import Utils.Random (shuffle)
1820

1921
main = do
2022
let m = M.fromAscList elems :: M.Map Int Int
2123
m_even = M.fromAscList elems_even :: M.Map Int Int
2224
m_odd = M.fromAscList elems_odd :: M.Map Int Int
2325
evaluate $ rnf [m, m_even, m_odd]
24-
evaluate $ rnf [elems_rev, elems_asc, elems_desc]
26+
evaluate $ rnf [elems_rev, elems_asc, elems_desc, elems_random]
27+
evaluate $ rnf keys_random
2528
defaultMain
2629
[ bench "lookup absent" $ whnf (lookup evens) m_odd
2730
, bench "lookup present" $ whnf (lookup evens) m_even
@@ -33,12 +36,16 @@ main = do
3336
, bench "alterF lookup present" $ whnf (atLookup evens) m_even
3437
, bench "alterF no rules lookup absent" $ whnf (atLookupNoRules evens) m_odd
3538
, bench "alterF no rules lookup present" $ whnf (atLookupNoRules evens) m_even
39+
, bench "insert" $ whnf (ins elems) M.empty
40+
, bench "insert random" $ whnf (ins elems_random) M.empty
3641
, bench "insert absent" $ whnf (ins elems_even) m_odd
3742
, bench "insert present" $ whnf (ins elems_even) m_even
3843
, bench "alterF insert absent" $ whnf (atIns elems_even) m_odd
3944
, bench "alterF insert present" $ whnf (atIns elems_even) m_even
4045
, bench "alterF no rules insert absent" $ whnf (atInsNoRules elems_even) m_odd
4146
, bench "alterF no rules insert present" $ whnf (atInsNoRules elems_even) m_even
47+
, bench "delete" $ whnf (del keys) m
48+
, bench "delete random" $ whnf (del keys_random) m
4249
, bench "delete absent" $ whnf (del evens) m_odd
4350
, bench "delete present" $ whnf (del evens) m
4451
, bench "alterF delete absent" $ whnf (atDel evens) m_odd
@@ -117,6 +124,9 @@ main = do
117124
evens = [2,4..bound]
118125
odds = [1,3..bound]
119126
values = [1..bound]
127+
stdGen = mkStdGen 42
128+
elems_random = shuffle stdGen elems
129+
keys_random = map fst elems_random
120130
sumkv k v1 v2 = k + v1 + v2
121131
consPair k v xs = (k, v) : xs
122132

containers-tests/benchmarks/Set.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@ import Control.Exception (evaluate)
77
import Test.Tasty.Bench (bench, defaultMain, whnf)
88
import Data.List (foldl')
99
import qualified Data.Set as S
10+
import System.Random (mkStdGen)
11+
import Utils.Random (shuffle)
1012

1113
main = do
1214
let s = S.fromAscList elems :: S.Set Int
1315
s_even = S.fromAscList elems_even :: S.Set Int
1416
s_odd = S.fromAscList elems_odd :: S.Set Int
1517
strings_s = S.fromList strings
1618
evaluate $ rnf [s, s_even, s_odd]
17-
evaluate $ rnf [elems_rev, elems_asc, elems_desc]
19+
evaluate $ rnf [elems_rev, elems_asc, elems_desc, elems_random]
1820
defaultMain
1921
[ bench "member" $ whnf (member elems) s
2022
, bench "insert" $ whnf (ins elems) S.empty
23+
, bench "insert random" $ whnf (ins elems_random) S.empty
2124
, bench "map" $ whnf (S.map (+ 1)) s
2225
, bench "filter" $ whnf (S.filter ((== 0) . (`mod` 2))) s
2326
, bench "partition" $ whnf (S.partition ((== 0) . (`mod` 2))) s
2427
, bench "delete" $ whnf (del elems) s
28+
, bench "delete random" $ whnf (del elems_random) s
2529
, bench "findMin" $ whnf S.findMin s
2630
, bench "findMax" $ whnf S.findMax s
2731
, bench "deleteMin" $ whnf S.deleteMin s
@@ -65,6 +69,8 @@ main = do
6569
elems_asc = map (`div` 2) [1..bound] -- [0,1,1,2,2..]
6670
elems_desc = map (`div` 2) [bound,bound-1..1] -- [..2,2,1,1,0]
6771
strings = map show elems
72+
stdGen = mkStdGen 42
73+
elems_random = shuffle stdGen elems
6874

6975
member :: [Int] -> S.Set Int -> Int
7076
member xs s = foldl' (\n x -> if S.member x s then n + 1 else n) 0 xs
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Utils.Random
2+
( shuffle
3+
) where
4+
5+
import Data.List (unfoldr)
6+
import System.Random (RandomGen, randomR)
7+
import qualified Data.Sequence as Seq
8+
9+
-- | O(n log n) Fisher-Yates shuffle.
10+
shuffle :: RandomGen g => g -> [a] -> [a]
11+
shuffle g0 xs0 = unfoldr f (g0, Seq.fromList xs0)
12+
where
13+
f (g, xs)
14+
| Seq.null xs = Nothing
15+
| otherwise = Just (x, (g', xs'))
16+
where
17+
(i, g') = randomR (0, Seq.length xs - 1) g
18+
x = Seq.index xs i
19+
xs' = Seq.deleteAt i xs
20+
{-# INLINABLE shuffle #-}

containers-tests/containers-tests.cabal

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ benchmark map-benchmarks
163163
hs-source-dirs: benchmarks
164164
main-is: Map.hs
165165
ghc-options: -O2
166+
build-depends:
167+
random >=1.0 && <1.3
168+
169+
other-modules:
170+
Utils.Random
166171

167172
benchmark tree-benchmarks
168173
import: benchmark-deps, warnings
@@ -180,7 +185,7 @@ benchmark sequence-benchmarks
180185
main-is: Sequence.hs
181186
ghc-options: -O2
182187
build-depends:
183-
random >=0 && <1.2
188+
random >=1.0 && <1.3
184189
, transformers
185190

186191
benchmark set-benchmarks
@@ -190,6 +195,11 @@ benchmark set-benchmarks
190195
hs-source-dirs: benchmarks
191196
main-is: Set.hs
192197
ghc-options: -O2
198+
build-depends:
199+
random >=1.0 && <1.3
200+
201+
other-modules:
202+
Utils.Random
193203

194204
benchmark graph-benchmarks
195205
import: benchmark-deps, warnings
@@ -199,7 +209,7 @@ benchmark graph-benchmarks
199209
main-is: Graph.hs
200210
ghc-options: -O2
201211
build-depends:
202-
random >=0 && <1.2
212+
random >=1.0 && <1.3
203213

204214
benchmark set-operations-intmap
205215
import: benchmark-deps, warnings

0 commit comments

Comments
 (0)