on 6cd235f help sign in
streamly/benchmark/BaseStreams.hs
267 lines 13 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2018 Harendra Kumar
4--
5-- License : BSD3
6-- Maintainer : harendra.kumar@gmail.com
8{-# LANGUAGE CPP #-}
10import Control.DeepSeq (NFData)
11-- import Data.Functor.Identity (Identity, runIdentity)
12import System.Random (randomRIO)
14import Gauge
15import qualified StreamDOps as D
16import qualified StreamKOps as K
18-- We need a monadic bind here to make sure that the function f does not get
19-- completely optimized out by the compiler in some cases.
20{-# INLINE benchIO #-}
21benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
22benchIO name run f = bench name $ nfIO $ randomRIO (1,1) >>= run . f
24benchFold :: NFData b
25 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
26benchFold name f src = bench name $ nfIO $ randomRIO (1,1) >>= f . src
28-- | Takes a source, and uses it with a default drain/fold method.
29{-# INLINE benchD #-}
30benchD :: String -> (Int -> D.Stream IO Int) -> Benchmark
31benchD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
33{-# INLINE benchK #-}
34benchK :: String -> (Int -> K.Stream IO Int) -> Benchmark
35benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
37{-
38_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
39_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
40-}
42main :: IO ()
43main =
44 defaultMain
45 [ bgroup "streamD"
46 [ bgroup "generation"
47 [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
48 , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
49 , benchIO "intFromTo" D.toNull D.sourceIntFromTo
51 , benchIO "fromList" D.toNull D.sourceFromList
52 -- , benchIO "fromFoldableM" D.sourceFromFoldableM
53 ]
54 , bgroup "elimination"
55 [ benchIO "toNull" D.toNull D.sourceUnfoldrM
56 , benchIO "mapM_" D.mapM_ D.sourceUnfoldrM
57 , benchIO "uncons" D.uncons D.sourceUnfoldrM
58 , benchFold "tail" D.tail D.sourceUnfoldrM
59 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
60 , benchIO "headTail" D.headTail D.sourceUnfoldrM
61 , benchFold "toList" D.toList D.sourceUnfoldrM
62 , benchFold "foldl'" D.foldl D.sourceUnfoldrM
63 , benchFold "last" D.last D.sourceUnfoldrM
64 ]
65 , bgroup "transformation"
66 [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
67 , benchIO "map" (D.map 1) D.sourceUnfoldrM
68 , benchIO "fmap" (D.fmap 1) D.sourceUnfoldrM
69 , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
70 , benchIO "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
71 , benchIO "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
72 -- This has horrible performance, never finishes
73 -- , benchIO "foldlS" (D.foldlS 1) D.sourceUnfoldrM
74 ]
75 , bgroup "transformationX4"
76 [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
77 , benchIO "map" (D.map 4) D.sourceUnfoldrM
78 , benchIO "fmap" (D.fmap 4) D.sourceUnfoldrM
79 , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
80 , benchIO "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
81 , benchIO "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
82 ]
83 , bgroup "filtering"
84 [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
85 , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
86 , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
87 , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
88 , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
89 , benchIO "drop-one" (D.dropOne 1) D.sourceUnfoldrM
90 , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
91 , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
92 , benchIO "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
93 ]
94 , bgroup "filteringX4"
95 [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
96 , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
97 , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
98 , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
99 , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
100 , benchIO "drop-one" (D.dropOne 4) D.sourceUnfoldrM
101 , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
102 , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
103 , benchIO "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
104 ]
105 , bgroup "zipping"
106 [ benchFold "eqBy" D.eqBy D.sourceUnfoldrM
107 , benchFold "cmpBy" D.cmpBy D.sourceUnfoldrM
108 , benchIO "zip" D.zip D.sourceUnfoldrM
109 ]
110 , bgroup "mixed"
111 [ benchIO "scan-map" (D.scanMap 1) D.sourceUnfoldrM
112 , benchIO "drop-map" (D.dropMap 1) D.sourceUnfoldrM
113 , benchIO "drop-scan" (D.dropScan 1) D.sourceUnfoldrM
114 , benchIO "take-drop" (D.takeDrop 1) D.sourceUnfoldrM
115 , benchIO "take-scan" (D.takeScan 1) D.sourceUnfoldrM
116 , benchIO "take-map" (D.takeMap 1) D.sourceUnfoldrM
117 , benchIO "filter-drop" (D.filterDrop 1) D.sourceUnfoldrM
118 , benchIO "filter-take" (D.filterTake 1) D.sourceUnfoldrM
119 , benchIO "filter-scan" (D.filterScan 1) D.sourceUnfoldrM
120 , benchIO "filter-map" (D.filterMap 1) D.sourceUnfoldrM
121 ]
122 , bgroup "mixedX2"
123 [ benchIO "scan-map" (D.scanMap 2) D.sourceUnfoldrM
124 , benchIO "drop-map" (D.dropMap 2) D.sourceUnfoldrM
125 , benchIO "drop-scan" (D.dropScan 2) D.sourceUnfoldrM
126 , benchIO "take-drop" (D.takeDrop 2) D.sourceUnfoldrM
127 , benchIO "take-scan" (D.takeScan 2) D.sourceUnfoldrM
128 , benchIO "take-map" (D.takeMap 2) D.sourceUnfoldrM
129 , benchIO "filter-drop" (D.filterDrop 2) D.sourceUnfoldrM
130 , benchIO "filter-take" (D.filterTake 2) D.sourceUnfoldrM
131 , benchIO "filter-scan" (D.filterScan 2) D.sourceUnfoldrM
132 , benchIO "filter-map" (D.filterMap 2) D.sourceUnfoldrM
133 ]
134 , bgroup "mixedX4"
135 [ benchIO "scan-map" (D.scanMap 4) D.sourceUnfoldrM
136 , benchIO "drop-map" (D.dropMap 4) D.sourceUnfoldrM
137 , benchIO "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
138 , benchIO "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
139 , benchIO "take-scan" (D.takeScan 4) D.sourceUnfoldrM
140 , benchIO "take-map" (D.takeMap 4) D.sourceUnfoldrM
141 , benchIO "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
142 , benchIO "filter-take" (D.filterTake 4) D.sourceUnfoldrM
143 , benchIO "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
144 , benchIO "filter-map" (D.filterMap 4) D.sourceUnfoldrM
145 ]
146 , bgroup "iterated"
147 [ benchD "mapM" D.iterateMapM
148 , benchD "scan(1/10)" D.iterateScan
149 , benchD "filterEven" D.iterateFilterEven
150 , benchD "takeAll" D.iterateTakeAll
151 , benchD "dropOne" D.iterateDropOne
152 , benchD "dropWhileFalse(1/10)" D.iterateDropWhileFalse
153 , benchD "dropWhileTrue" D.iterateDropWhileTrue
154 ]
155 ]
156 , bgroup "streamK"
157 [ bgroup "generation"
158 [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
159 , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
160 -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
162 , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
163 -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
165 -- appends
166 , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
167 , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
168 ]
169 , bgroup "elimination"
170 [ benchIO "toNull" K.toNull K.sourceUnfoldrM
171 , benchIO "mapM_" K.mapM_ K.sourceUnfoldrM
172 , benchIO "uncons" K.uncons K.sourceUnfoldrM
173 , benchFold "init" K.init K.sourceUnfoldrM
174 , benchFold "tail" K.tail K.sourceUnfoldrM
175 , benchIO "nullTail" K.nullTail K.sourceUnfoldrM
176 , benchIO "headTail" K.headTail K.sourceUnfoldrM
177 , benchFold "toList" K.toList K.sourceUnfoldrM
178 , benchFold "foldl'" K.foldl K.sourceUnfoldrM
179 , benchFold "last" K.last K.sourceUnfoldrM
180 ]
181 , bgroup "transformation"
182 [ benchIO "scan" (K.scan 1) K.sourceUnfoldrM
183 , benchIO "map" (K.map 1) K.sourceUnfoldrM
184 , benchIO "fmap" (K.fmap 1) K.sourceUnfoldrM
185 , benchIO "mapM" (K.mapM 1) K.sourceUnfoldrM
186 -- , benchIO "concat" K.concat K.sourceUnfoldrM
187 , benchIO "foldlS" (K.foldlS 1) K.sourceUnfoldrM
188 ]
189 , bgroup "transformationX4"
190 [ benchIO "scan" (K.scan 4) K.sourceUnfoldrM
191 , benchIO "map" (K.map 4) K.sourceUnfoldrM
192 , benchIO "fmap" (K.fmap 4) K.sourceUnfoldrM
193 , benchIO "mapM" (K.mapM 4) K.sourceUnfoldrM
194 -- , benchIO "concat" K.concat K.sourceUnfoldrM
195 ]
196 , bgroup "filtering"
197 [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
198 , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
199 , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
200 , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
201 , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
202 , benchIO "drop-one" (K.dropOne 1) K.sourceUnfoldrM
203 , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
204 , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
205 , benchIO "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
206 ]
207 , bgroup "filteringX4"
208 [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
209 , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
210 , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
211 , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
212 , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
213 , benchIO "drop-one" (K.dropOne 4) K.sourceUnfoldrM
214 , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
215 , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
216 , benchIO "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
217 ]
218 , bgroup "zipping"
219 [ benchIO "zip" K.zip K.sourceUnfoldrM
220 ]
221 , bgroup "mixed"
222 [ benchIO "scan-map" (K.scanMap 1) K.sourceUnfoldrM
223 , benchIO "drop-map" (K.dropMap 1) K.sourceUnfoldrM
224 , benchIO "drop-scan" (K.dropScan 1) K.sourceUnfoldrM
225 , benchIO "take-drop" (K.takeDrop 1) K.sourceUnfoldrM
226 , benchIO "take-scan" (K.takeScan 1) K.sourceUnfoldrM
227 , benchIO "take-map" (K.takeMap 1) K.sourceUnfoldrM
228 , benchIO "filter-drop" (K.filterDrop 1) K.sourceUnfoldrM
229 , benchIO "filter-take" (K.filterTake 1) K.sourceUnfoldrM
230 , benchIO "filter-scan" (K.filterScan 1) K.sourceUnfoldrM
231 , benchIO "filter-map" (K.filterMap 1) K.sourceUnfoldrM
232 ]
233 , bgroup "mixedX2"
234 [ benchIO "scan-map" (K.scanMap 2) K.sourceUnfoldrM
235 , benchIO "drop-map" (K.dropMap 2) K.sourceUnfoldrM
236 , benchIO "drop-scan" (K.dropScan 2) K.sourceUnfoldrM
237 , benchIO "take-drop" (K.takeDrop 2) K.sourceUnfoldrM
238 , benchIO "take-scan" (K.takeScan 2) K.sourceUnfoldrM
239 , benchIO "take-map" (K.takeMap 2) K.sourceUnfoldrM
240 , benchIO "filter-drop" (K.filterDrop 2) K.sourceUnfoldrM
241 , benchIO "filter-take" (K.filterTake 2) K.sourceUnfoldrM
242 , benchIO "filter-scan" (K.filterScan 2) K.sourceUnfoldrM
243 , benchIO "filter-map" (K.filterMap 2) K.sourceUnfoldrM
244 ]
245 , bgroup "mixedX4"
246 [ benchIO "scan-map" (K.scanMap 4) K.sourceUnfoldrM
247 , benchIO "drop-map" (K.dropMap 4) K.sourceUnfoldrM
248 , benchIO "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
249 , benchIO "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
250 , benchIO "take-scan" (K.takeScan 4) K.sourceUnfoldrM
251 , benchIO "take-map" (K.takeMap 4) K.sourceUnfoldrM
252 , benchIO "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
253 , benchIO "filter-take" (K.filterTake 4) K.sourceUnfoldrM
254 , benchIO "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
255 , benchIO "filter-map" (K.filterMap 4) K.sourceUnfoldrM
256 ]
257 , bgroup "iterated"
258 [ benchK "mapM" K.iterateMapM
259 , benchK "scan(1/10)" K.iterateScan
260 , benchK "filterEven" K.iterateFilterEven
261 , benchK "takeAll" K.iterateTakeAll
262 , benchK "dropOne" K.iterateDropOne
263 , benchK "dropWhileFalse(1/10)" K.iterateDropWhileFalse
264 , benchK "dropWhileTrue" K.iterateDropWhileTrue
265 ]
266 ]
267 ]