on fe28607 help sign in
185 lines 6.2 kB history raw
1-------------------------------------------------------------------------------
2-- Benchmark helpers
3-------------------------------------------------------------------------------
5{-# INLINE benchIO #-}
6benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
7benchIO name src f = bench name $ nfIO $
8 (randomRIO (1,1) >>= src) <&> f
10{-# INLINE benchPureSink #-}
11benchPureSink :: NFData b => Int -> String -> (Stream Int -> b) -> Benchmark
12benchPureSink value name = benchIO name (sourceIntFromTo value)
14{-# INLINE benchIO' #-}
15benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
16benchIO' name src f = bench name $ nfIO $
17 randomRIO (1,1) >>= src >>= f
19{-# INLINE benchIOSink #-}
20benchIOSink :: NFData b => Int -> String -> (Stream Int -> IO b) -> Benchmark
21benchIOSink value name = benchIO' name (sourceIntFromTo value)
23-------------------------------------------------------------------------------
24-- Bench Ops
25-------------------------------------------------------------------------------
27{-# INLINE sourceUnfoldr #-}
28sourceUnfoldr :: MonadIO m => Int -> Int -> m (Stream Int)
29sourceUnfoldr value n = S.fold (A.writeN value) $ S.unfoldr step n
30 where
31 step cnt =
32 if cnt > n + value
33 then Nothing
34 else Just (cnt, cnt + 1)
36{-# INLINE sourceIntFromTo #-}
37sourceIntFromTo :: MonadIO m => Int -> Int -> m (Stream Int)
38sourceIntFromTo value n = S.fold (A.writeN value) $ S.enumerateFromTo n (n + value)
40{-# INLINE sourceFromList #-}
41sourceFromList :: MonadIO m => Int -> Int -> m (Stream Int)
42sourceFromList value n = S.fold (A.writeN value) $ S.fromList [n..n+value]
44-------------------------------------------------------------------------------
45-- Transformation
46-------------------------------------------------------------------------------
48{-# INLINE composeN #-}
49composeN :: P.Monad m
50 => Int -> (Stream Int -> m (Stream Int)) -> Stream Int -> m (Stream Int)
51composeN n f x =
52 case n of
53 1 -> f x
54 2 -> f x P.>>= f
55 3 -> f x P.>>= f P.>>= f
56 4 -> f x P.>>= f P.>>= f P.>>= f
57 _ -> undefined
59{-# INLINE scanl' #-}
60{-# INLINE scanl1' #-}
61{-# INLINE map #-}
63scanl' , scanl1', map
64 :: MonadIO m => Int -> Int -> Stream Int -> m (Stream Int)
67{-# INLINE onArray #-}
68onArray
69 :: MonadIO m => Int -> (Stream.Stream m Int -> Stream.Stream m Int)
70 -> Stream Int
71 -> m (Stream Int)
72onArray value f arr = S.fold (A.writeN value) $ f $ S.unfold A.reader arr
74scanl' value n = composeN n $ onArray value $ S.scanl' (+) 0
75scanl1' value n = composeN n $ onArray value $ S.scanl1' (+)
76map value n = composeN n $ onArray value $ S.map (+1)
77-- map n = composeN n $ A.map (+1)
79{-# INLINE eqInstance #-}
80eqInstance :: Stream Int -> Bool
81eqInstance src = src == src
83{-# INLINE eqInstanceNotEq #-}
84eqInstanceNotEq :: Stream Int -> Bool
85eqInstanceNotEq src = src P./= src
87{-# INLINE ordInstance #-}
88ordInstance :: Stream Int -> Bool
89ordInstance src = src P.< src
91{-# INLINE ordInstanceMin #-}
92ordInstanceMin :: Stream Int -> Stream Int
93ordInstanceMin src = P.min src src
95{-# INLINE showInstance #-}
96showInstance :: Stream Int -> P.String
97showInstance = P.show
99{-# INLINE pureFoldl' #-}
100pureFoldl' :: MonadIO m => Stream Int -> m Int
101pureFoldl' = S.foldl' (+) 0 . S.unfold A.reader
103-------------------------------------------------------------------------------
104-- Elimination
105-------------------------------------------------------------------------------
107{-# INLINE unfoldReadDrain #-}
108unfoldReadDrain :: MonadIO m => Stream Int -> m ()
109unfoldReadDrain = S.drain . S.unfold A.reader
111{-# INLINE toStreamRevDrain #-}
112toStreamRevDrain :: MonadIO m => Stream Int -> m ()
113toStreamRevDrain = S.drain . A.readRev
115-------------------------------------------------------------------------------
116-- Bench groups
117-------------------------------------------------------------------------------
119common_o_1_space_generation :: Int -> [Benchmark]
120common_o_1_space_generation value =
121 [ bgroup
122 "generation"
123 [ benchIOSrc "writeN . intFromTo" (sourceIntFromTo value)
124 , benchIOSrc
125 "fromList . intFromTo"
126 (sourceIntFromToFromList value)
127 , benchIOSrc "writeN . unfoldr" (sourceUnfoldr value)
128 , benchIOSrc "writeN . fromList" (sourceFromList value)
129 , benchPureSink value "show" showInstance
130 ]
131 ]
133common_o_1_space_elimination :: Int -> [Benchmark]
134common_o_1_space_elimination value =
135 [ bgroup "elimination"
136 [ benchPureSink value "id" id
137 , benchPureSink value "==" eqInstance
138 , benchPureSink value "/=" eqInstanceNotEq
139 , benchPureSink value "<" ordInstance
140 , benchPureSink value "min" ordInstanceMin
141 , benchIOSink value "foldl'" pureFoldl'
142 , benchIOSink value "read" unfoldReadDrain
143 , benchIOSink value "toStreamRev" toStreamRevDrain
144 ]
145 ]
147common_o_n_heap_serial :: Int -> [Benchmark]
148common_o_n_heap_serial value =
149 [ bgroup "elimination"
150 [
151 -- Converting the stream to an array
152 benchFold "writeN" (S.fold (A.writeN value))
153 (P.sourceUnfoldrM value)
154 ]
155 ]
157common_o_1_space_transformation :: Int -> [Benchmark]
158common_o_1_space_transformation value =
159 [ bgroup "transformation"
160 [ benchIOSink value "scanl'" (scanl' value 1)
161 , benchIOSink value "scanl1'" (scanl1' value 1)
162 , benchIOSink value "map" (map value 1)
163 ]
164 ]
166common_o_1_space_transformationX4 :: Int -> [Benchmark]
167common_o_1_space_transformationX4 value =
168 [ bgroup "transformationX4"
169 [ benchIOSink value "scanl'" (scanl' value 4)
170 , benchIOSink value "scanl1'" (scanl1' value 4)
171 , benchIOSink value "map" (map value 4)
172 ]
173 ]
175commonBenchmarks :: Int -> [Benchmark]
176commonBenchmarks size =
177 [ bgroup (o_1_space_prefix moduleName) $ concat
178 [ common_o_1_space_generation size
179 , common_o_1_space_elimination size
180 , common_o_1_space_transformation size
181 , common_o_1_space_transformationX4 size
182 ]
183 , bgroup (o_n_space_prefix moduleName) $
184 common_o_n_heap_serial size
185 ]