77
88module Main where
99
10+ import Control.DeepSeq (NFData )
1011import Control.Monad (replicateM )
1112import Data.Bits (testBit )
1213import Data.HashMap.Strict (HashMap )
@@ -31,43 +32,46 @@ main =
3132 bgroup " HashSet" [bSetFromList]
3233 ]
3334
34- defaultGen :: StdGen
35- defaultGen = mkStdGen 42
36-
3735defaultSizes :: [Int ]
3836defaultSizes = [0 , 1 , 10 , 100 , 1000 , 10_000 , 100_000 ]
3937
38+ -- | Length of a 'Bytes' key in bytes.
39+ --
40+ -- For comparison: A SHA256 hash is 32 bytes long.
4041bytesLength :: Int
4142bytesLength = 32
4243
44+ -- | Pseudo-random generator for keys etc.
45+ --
46+ -- Change the seed to generate different random elements.
47+ defaultGen :: StdGen
48+ defaultGen = mkStdGen 42
49+
50+ env' ::
51+ (NFData a ) =>
52+ Int ->
53+ (Int -> IOGenM StdGen -> IO a ) ->
54+ (a -> Benchmarkable ) ->
55+ Benchmark
56+ env' size setup run =
57+ env
58+ ( do
59+ gen <- newIOGenM defaultGen
60+ setup size gen
61+ )
62+ (\ x -> bench (show size) (run x))
63+
4364bFromList :: Benchmark
4465bFromList =
4566 bgroup
4667 " fromList"
47- [ bgroup
48- " Bytes"
49- [ env
50- ( do
51- g <- newIOGenM defaultGen
52- genNBytes s bytesLength g
53- )
54- $ \ keys ->
55- bench (show s) $ whnf (HM. fromList . map (,() )) keys
56- | s <- sizes
57- ],
58- bgroup
59- " Int"
60- [ env
61- ( do
62- g <- newIOGenM defaultGen
63- genInts s g
64- )
65- $ \ keys -> bench (show s) $ whnf (HM. fromList . map (,() )) keys
66- | s <- sizes
67- ]
68+ [ bgroup " Bytes" [env' s setupBytes run | s <- defaultSizes],
69+ bgroup " Int" [env' s genInts run | s <- defaultSizes]
6870 ]
6971 where
70- sizes = defaultSizes
72+ setupBytes s = genNBytes s bytesLength
73+ run :: (Hashable a ) => [a ] -> Benchmarkable
74+ run = whnf (HM. fromList . map (,() ))
7175
7276bUnion :: Benchmark
7377bUnion =
0 commit comments