3-- Copyright : (c) 2018 Harendra Kumar
6-- Maintainer : streamly@composewell.com
10import Control.DeepSeq (NFData)
11-- import Data.Functor.Identity (Identity, runIdentity)
12import System.Random (randomRIO)
15import qualified StreamDOps as D
16import qualified StreamKOps as K
17import qualified StreamDKOps as DK
18import qualified Data.List as List
20-- We need a monadic bind here to make sure that the function f does not get
21-- completely optimized out by the compiler in some cases.
23benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
24benchIO name run f = bench name $ nfIO $ randomRIO (1,1) >>= run . f
26{-# INLINE _benchIOSrcK #-}
29 -> (Int -> K.Stream IO Int)
31_benchIOSrcK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
33{-# INLINE _benchIOSrcD #-}
36 -> (Int -> D.Stream IO Int)
38_benchIOSrcD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
41 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
42benchFold name f src = bench name $ nfIO $ randomRIO (1,1) >>= f . src
44-- | Takes a source, and uses it with a default drain/fold method.
46benchD :: String -> (Int -> D.Stream IO Int) -> Benchmark
47benchD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
50benchK :: String -> (Int -> K.Stream IO Int) -> Benchmark
51benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
54_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
55_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
58{-# INLINE benchPure #-}
59benchPure :: String -> ([Int] -> [Int]) -> (Int -> [Int]) -> Benchmark
60benchPure name run f = bench name $ nfIO $ randomRIO (1,1) >>= return . run . f
67 [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
68 , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
69 , benchIO "intFromTo" D.toNull D.sourceIntFromTo
71 , benchIO "fromList" D.toNull D.sourceFromList
72 -- , benchIO "fromFoldableM" D.sourceFromFoldableM
74 , bgroup "elimination"
75 [ benchIO "toNull" D.toNull D.sourceUnfoldrM
76 , benchIO "mapM_" D.mapM_ D.sourceUnfoldrM
77 , benchIO "uncons" D.uncons D.sourceUnfoldrM
78 , benchFold "tail" D.tail D.sourceUnfoldrM
79 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
80 , benchIO "headTail" D.headTail D.sourceUnfoldrM
81 , benchFold "toList" D.toList D.sourceUnfoldrM
82 , benchFold "foldl'" D.foldl D.sourceUnfoldrM
83 , benchFold "last" D.last D.sourceUnfoldrM
86 [ benchIO "toNullAp" D.toNullApNested (D.sourceUnfoldrMN D.value2)
87 , benchIO "toNull" D.toNullNested (D.sourceUnfoldrMN D.value2)
88 , benchIO "toNull3" D.toNullNested3 (D.sourceUnfoldrMN D.value3)
89 , benchIO "filterAllIn" D.filterAllInNested (D.sourceUnfoldrMN K.value2)
90 , benchIO "filterAllOut" D.filterAllOutNested (D.sourceUnfoldrMN K.value2)
91 , benchIO "toNullApPure" D.toNullApNested (D.sourceUnfoldrN K.value2)
92 , benchIO "toNullPure" D.toNullNested (D.sourceUnfoldrN K.value2)
93 , benchIO "toNull3Pure" D.toNullNested3 (D.sourceUnfoldrN K.value3)
94 , benchIO "filterAllInPure" D.filterAllInNested (D.sourceUnfoldrN K.value2)
95 , benchIO "filterAllOutPure" D.filterAllOutNested (D.sourceUnfoldrN K.value2)
97 , bgroup "transformation"
98 [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
99 , benchIO "map" (D.map 1) D.sourceUnfoldrM
100 , benchIO "fmap" (D.fmap 1) D.sourceUnfoldrM
101 , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
102 , benchIO "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
103 , benchIO "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
104 , benchIO "concatMapNxN" (D.concatMap 1) (D.sourceUnfoldrMN D.value2)
105 , benchIO "concatMapRepl4xN" D.concatMapRepl4xN
106 (D.sourceUnfoldrMN (D.value `div` 4))
107 , benchIO "concatMapPureNxN" (D.concatMap 1) (D.sourceUnfoldrN D.value2)
108 , benchIO "concatMapURepl4xN" D.concatMapURepl4xN
109 (D.sourceUnfoldrMN (D.value `div` 4))
110 , benchIO "intersperse" (D.intersperse 1) (D.sourceUnfoldrMN D.value2)
111 , benchIO "interspersePure" (D.intersperse 1) (D.sourceUnfoldrN D.value2)
112 -- , benchIO "foldrS" (D.foldrS 1) D.sourceUnfoldrM
113 -- This has horrible performance, never finishes
114 -- , benchIO "foldlS" (D.foldlS 1) D.sourceUnfoldrM
116 , bgroup "transformationX4"
117 [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
118 , benchIO "map" (D.map 4) D.sourceUnfoldrM
119 , benchIO "fmap" (D.fmap 4) D.sourceUnfoldrM
120 , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
121 , benchIO "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
122 , benchIO "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
123 -- , benchIO "concatMap" (D.concatMap 4) (D.sourceUnfoldrMN D.value16)
124 , benchIO "intersperse" (D.intersperse 4) (D.sourceUnfoldrMN D.value16)
127 [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
128 , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
129 , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
130 , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
131 , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
132 , benchIO "drop-one" (D.dropOne 1) D.sourceUnfoldrM
133 , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
134 , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
135 , benchIO "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
137 , bgroup "filteringX4"
138 [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
139 , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
140 , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
141 , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
142 , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
143 , benchIO "drop-one" (D.dropOne 4) D.sourceUnfoldrM
144 , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
145 , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
146 , benchIO "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
149 [ benchFold "eqBy" D.eqBy D.sourceUnfoldrM
150 , benchFold "cmpBy" D.cmpBy D.sourceUnfoldrM
151 , benchIO "zip" D.zip D.sourceUnfoldrM
154 [ benchIO "scan-map" (D.scanMap 1) D.sourceUnfoldrM
155 , benchIO "drop-map" (D.dropMap 1) D.sourceUnfoldrM
156 , benchIO "drop-scan" (D.dropScan 1) D.sourceUnfoldrM
157 , benchIO "take-drop" (D.takeDrop 1) D.sourceUnfoldrM
158 , benchIO "take-scan" (D.takeScan 1) D.sourceUnfoldrM
159 , benchIO "take-map" (D.takeMap 1) D.sourceUnfoldrM
160 , benchIO "filter-drop" (D.filterDrop 1) D.sourceUnfoldrM
161 , benchIO "filter-take" (D.filterTake 1) D.sourceUnfoldrM
162 , benchIO "filter-scan" (D.filterScan 1) D.sourceUnfoldrM
163 , benchIO "filter-map" (D.filterMap 1) D.sourceUnfoldrM
166 [ benchIO "scan-map" (D.scanMap 2) D.sourceUnfoldrM
167 , benchIO "drop-map" (D.dropMap 2) D.sourceUnfoldrM
168 , benchIO "drop-scan" (D.dropScan 2) D.sourceUnfoldrM
169 , benchIO "take-drop" (D.takeDrop 2) D.sourceUnfoldrM
170 , benchIO "take-scan" (D.takeScan 2) D.sourceUnfoldrM
171 , benchIO "take-map" (D.takeMap 2) D.sourceUnfoldrM
172 , benchIO "filter-drop" (D.filterDrop 2) D.sourceUnfoldrM
173 , benchIO "filter-take" (D.filterTake 2) D.sourceUnfoldrM
174 , benchIO "filter-scan" (D.filterScan 2) D.sourceUnfoldrM
175 , benchIO "filter-map" (D.filterMap 2) D.sourceUnfoldrM
178 [ benchIO "scan-map" (D.scanMap 4) D.sourceUnfoldrM
179 , benchIO "drop-map" (D.dropMap 4) D.sourceUnfoldrM
180 , benchIO "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
181 , benchIO "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
182 , benchIO "take-scan" (D.takeScan 4) D.sourceUnfoldrM
183 , benchIO "take-map" (D.takeMap 4) D.sourceUnfoldrM
184 , benchIO "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
185 , benchIO "filter-take" (D.filterTake 4) D.sourceUnfoldrM
186 , benchIO "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
187 , benchIO "filter-map" (D.filterMap 4) D.sourceUnfoldrM
190 [ benchD "mapM" D.iterateMapM
191 , benchD "scan(1/10)" D.iterateScan
192 , benchD "filterEven" D.iterateFilterEven
193 , benchD "takeAll" D.iterateTakeAll
194 , benchD "dropOne" D.iterateDropOne
195 , benchD "dropWhileFalse(1/10)" D.iterateDropWhileFalse
196 , benchD "dropWhileTrue" D.iterateDropWhileTrue
197 , benchD "iterateM" D.iterateM
202 [ bgroup "elimination"
203 [ benchPure "last" (\xs -> [List.last xs]) (K.sourceUnfoldrList K.value)
206 [ benchPure "toNullAp" K.toNullApNestedList (K.sourceUnfoldrList K.value2)
207 , benchPure "toNull" K.toNullNestedList (K.sourceUnfoldrList K.value2)
208 , benchPure "toNull3" K.toNullNestedList3 (K.sourceUnfoldrList K.value3)
209 , benchPure "filterAllIn" K.filterAllInNestedList (K.sourceUnfoldrList K.value2)
210 , benchPure "filterAllOut" K.filterAllOutNestedList (K.sourceUnfoldrList K.value2)
214 [ bgroup "generation"
215 [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
216 , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
217 -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
219 , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
220 -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
223 , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
224 , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
226 , bgroup "elimination"
227 [ benchIO "toNull" K.toNull K.sourceUnfoldrM
228 , benchIO "mapM_" K.mapM_ K.sourceUnfoldrM
229 , benchIO "uncons" K.uncons K.sourceUnfoldrM
230 , benchFold "init" K.init K.sourceUnfoldrM
231 , benchFold "tail" K.tail K.sourceUnfoldrM
232 , benchIO "nullTail" K.nullTail K.sourceUnfoldrM
233 , benchIO "headTail" K.headTail K.sourceUnfoldrM
234 , benchFold "toList" K.toList K.sourceUnfoldrM
235 , benchFold "foldl'" K.foldl K.sourceUnfoldrM
236 , benchFold "last" K.last K.sourceUnfoldrM
239 [ benchIO "toNullAp" K.toNullApNested (K.sourceUnfoldrMN K.value2)
240 , benchIO "toNull" K.toNullNested (K.sourceUnfoldrMN K.value2)
241 , benchIO "toNull3" K.toNullNested3 (K.sourceUnfoldrMN K.value3)
242 , benchIO "filterAllIn" K.filterAllInNested (K.sourceUnfoldrMN K.value2)
243 , benchIO "filterAllOut" K.filterAllOutNested (K.sourceUnfoldrMN K.value2)
244 , benchIO "toNullApPure" K.toNullApNested (K.sourceUnfoldrN K.value2)
245 , benchIO "toNullPure" K.toNullNested (K.sourceUnfoldrN K.value2)
246 , benchIO "toNull3Pure" K.toNullNested3 (K.sourceUnfoldrN K.value3)
247 , benchIO "filterAllInPure" K.filterAllInNested (K.sourceUnfoldrN K.value2)
248 , benchIO "filterAllOutPure" K.filterAllOutNested (K.sourceUnfoldrN K.value2)
250 , bgroup "transformation"
251 [ benchIO "scan" (K.scan 1) K.sourceUnfoldrM
252 , benchIO "map" (K.map 1) K.sourceUnfoldrM
253 , benchIO "fmap" (K.fmap 1) K.sourceUnfoldrM
254 , benchIO "mapM" (K.mapM 1) K.sourceUnfoldrM
255 , benchIO "mapMSerial" (K.mapMSerial 1) K.sourceUnfoldrM
256 -- , benchIOSrcK "concatMap" K.concatMap
257 , benchIO "concatMapNxN" (K.concatMap 1) (K.sourceUnfoldrMN K.value2)
258 , benchIO "concatMapPureNxN" (K.concatMap 1) (K.sourceUnfoldrN K.value2)
259 , benchIO "concatMapRepl4xN" K.concatMapRepl4xN
260 (K.sourceUnfoldrMN (K.value `div` 4))
261 , benchIO "intersperse" (K.intersperse 1) (K.sourceUnfoldrMN K.value2)
262 , benchIO "interspersePure" (K.intersperse 1) (K.sourceUnfoldrN K.value2)
263 , benchIO "foldlS" (K.foldlS 1) K.sourceUnfoldrM
265 , bgroup "transformationX4"
266 [ benchIO "scan" (K.scan 4) K.sourceUnfoldrM
267 , benchIO "map" (K.map 4) K.sourceUnfoldrM
268 , benchIO "fmap" (K.fmap 4) K.sourceUnfoldrM
269 , benchIO "mapM" (K.mapM 4) K.sourceUnfoldrM
270 , benchIO "mapMSerial" (K.mapMSerial 4) K.sourceUnfoldrM
271 -- , benchIO "concatMap" (K.concatMap 4) (K.sourceUnfoldrMN K.value16)
272 , benchIO "intersperse" (K.intersperse 4) (K.sourceUnfoldrMN K.value16)
275 [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
276 , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
277 , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
278 , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
279 , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
280 , benchIO "drop-one" (K.dropOne 1) K.sourceUnfoldrM
281 , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
282 , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
283 , benchIO "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
285 , bgroup "filteringX4"
286 [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
287 , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
288 , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
289 , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
290 , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
291 , benchIO "drop-one" (K.dropOne 4) K.sourceUnfoldrM
292 , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
293 , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
294 , benchIO "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
297 [ benchIO "zip" K.zip K.sourceUnfoldrM
300 [ benchIO "scan-map" (K.scanMap 1) K.sourceUnfoldrM
301 , benchIO "drop-map" (K.dropMap 1) K.sourceUnfoldrM
302 , benchIO "drop-scan" (K.dropScan 1) K.sourceUnfoldrM
303 , benchIO "take-drop" (K.takeDrop 1) K.sourceUnfoldrM
304 , benchIO "take-scan" (K.takeScan 1) K.sourceUnfoldrM
305 , benchIO "take-map" (K.takeMap 1) K.sourceUnfoldrM
306 , benchIO "filter-drop" (K.filterDrop 1) K.sourceUnfoldrM
307 , benchIO "filter-take" (K.filterTake 1) K.sourceUnfoldrM
308 , benchIO "filter-scan" (K.filterScan 1) K.sourceUnfoldrM
309 , benchIO "filter-map" (K.filterMap 1) K.sourceUnfoldrM
312 [ benchIO "scan-map" (K.scanMap 2) K.sourceUnfoldrM
313 , benchIO "drop-map" (K.dropMap 2) K.sourceUnfoldrM
314 , benchIO "drop-scan" (K.dropScan 2) K.sourceUnfoldrM
315 , benchIO "take-drop" (K.takeDrop 2) K.sourceUnfoldrM
316 , benchIO "take-scan" (K.takeScan 2) K.sourceUnfoldrM
317 , benchIO "take-map" (K.takeMap 2) K.sourceUnfoldrM
318 , benchIO "filter-drop" (K.filterDrop 2) K.sourceUnfoldrM
319 , benchIO "filter-take" (K.filterTake 2) K.sourceUnfoldrM
320 , benchIO "filter-scan" (K.filterScan 2) K.sourceUnfoldrM
321 , benchIO "filter-map" (K.filterMap 2) K.sourceUnfoldrM
324 [ benchIO "scan-map" (K.scanMap 4) K.sourceUnfoldrM
325 , benchIO "drop-map" (K.dropMap 4) K.sourceUnfoldrM
326 , benchIO "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
327 , benchIO "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
328 , benchIO "take-scan" (K.takeScan 4) K.sourceUnfoldrM
329 , benchIO "take-map" (K.takeMap 4) K.sourceUnfoldrM
330 , benchIO "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
331 , benchIO "filter-take" (K.filterTake 4) K.sourceUnfoldrM
332 , benchIO "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
333 , benchIO "filter-map" (K.filterMap 4) K.sourceUnfoldrM
336 [ benchK "mapM" K.iterateMapM
337 , benchK "scan(1/10)" K.iterateScan
338 , benchK "filterEven" K.iterateFilterEven
339 , benchK "takeAll" K.iterateTakeAll
340 , benchK "dropOne" K.iterateDropOne
341 , benchK "dropWhileFalse(1/10)" K.iterateDropWhileFalse
342 , benchK "dropWhileTrue" K.iterateDropWhileTrue
346 [ bgroup "generation"
347 [ benchIO "unfoldr" DK.toNull DK.sourceUnfoldr
348 , benchIO "unfoldrM" DK.toNull DK.sourceUnfoldrM
350 , bgroup "elimination"
351 [ benchIO "toNull" DK.toNull DK.sourceUnfoldrM
352 , benchIO "uncons" DK.uncons DK.sourceUnfoldrM
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list