3-- Copyright : (c) 2018 Harendra Kumar
6-- Maintainer : harendra.kumar@gmail.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
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.
21benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
22benchIO name run f = bench name $ nfIO $ randomRIO (1,1) >>= run . f
24{-# INLINE _benchIOSrcK #-}
27 -> (Int -> K.Stream IO Int)
29_benchIOSrcK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
31{-# INLINE _benchIOSrcD #-}
34 -> (Int -> D.Stream IO Int)
36_benchIOSrcD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
39 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
40benchFold name f src = bench name $ nfIO $ randomRIO (1,1) >>= f . src
42-- | Takes a source, and uses it with a default drain/fold method.
44benchD :: String -> (Int -> D.Stream IO Int) -> Benchmark
45benchD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
48benchK :: String -> (Int -> K.Stream IO Int) -> Benchmark
49benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
52_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
53_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
56{-# INLINE benchPure #-}
57benchPure :: String -> ([Int] -> [Int]) -> (Int -> [Int]) -> Benchmark
58benchPure name run f = bench name $ nfIO $ randomRIO (1,1) >>= return . run . f
65 [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
66 , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
67 , benchIO "intFromTo" D.toNull D.sourceIntFromTo
69 , benchIO "fromList" D.toNull D.sourceFromList
70 -- , benchIO "fromFoldableM" D.sourceFromFoldableM
72 , bgroup "elimination"
73 [ benchIO "toNull" D.toNull D.sourceUnfoldrM
74 , benchIO "mapM_" D.mapM_ D.sourceUnfoldrM
75 , benchIO "uncons" D.uncons D.sourceUnfoldrM
76 , benchFold "tail" D.tail D.sourceUnfoldrM
77 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
78 , benchIO "headTail" D.headTail D.sourceUnfoldrM
79 , benchFold "toList" D.toList D.sourceUnfoldrM
80 , benchFold "foldl'" D.foldl D.sourceUnfoldrM
81 , benchFold "last" D.last D.sourceUnfoldrM
84 [ benchIO "toNullAp" D.toNullApNested (D.sourceUnfoldrMN D.value2)
85 , benchIO "toNull" D.toNullNested (D.sourceUnfoldrMN D.value2)
86 , benchIO "toNull3" D.toNullNested3 (D.sourceUnfoldrMN D.value3)
87 , benchIO "filterAllIn" D.filterAllInNested (D.sourceUnfoldrMN K.value2)
88 , benchIO "filterAllOut" D.filterAllOutNested (D.sourceUnfoldrMN K.value2)
89 , benchIO "toNullApPure" D.toNullApNested (D.sourceUnfoldrN K.value2)
90 , benchIO "toNullPure" D.toNullNested (D.sourceUnfoldrN K.value2)
91 , benchIO "toNull3Pure" D.toNullNested3 (D.sourceUnfoldrN K.value3)
92 , benchIO "filterAllInPure" D.filterAllInNested (D.sourceUnfoldrN K.value2)
93 , benchIO "filterAllOutPure" D.filterAllOutNested (D.sourceUnfoldrN K.value2)
95 , bgroup "transformation"
96 [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
97 , benchIO "map" (D.map 1) D.sourceUnfoldrM
98 , benchIO "fmap" (D.fmap 1) D.sourceUnfoldrM
99 , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
100 , benchIO "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
101 , benchIO "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
102 , benchIO "concatMapNxN" (D.concatMap 1) (D.sourceUnfoldrMN D.value2)
103 , benchIO "concatMapRepl4xN" D.concatMapRepl4xN
104 (D.sourceUnfoldrMN (D.value `div` 4))
105 , benchIO "concatMapPureNxN" (D.concatMap 1) (D.sourceUnfoldrN D.value2)
106 , benchIO "flattenRepl4xN" D.flattenRepl4xN
107 (D.sourceUnfoldrMN (D.value `div` 4))
108 , benchIO "intersperse" (D.intersperse 1) (D.sourceUnfoldrMN D.value2)
109 , benchIO "interspersePure" (D.intersperse 1) (D.sourceUnfoldrN D.value2)
110 -- , benchIO "foldrS" (D.foldrS 1) D.sourceUnfoldrM
111 -- This has horrible performance, never finishes
112 -- , benchIO "foldlS" (D.foldlS 1) D.sourceUnfoldrM
114 , bgroup "transformationX4"
115 [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
116 , benchIO "map" (D.map 4) D.sourceUnfoldrM
117 , benchIO "fmap" (D.fmap 4) D.sourceUnfoldrM
118 , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
119 , benchIO "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
120 , benchIO "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
121 -- , benchIO "concatMap" (D.concatMap 4) (D.sourceUnfoldrMN D.value16)
122 , benchIO "intersperse" (D.intersperse 4) (D.sourceUnfoldrMN D.value16)
125 [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
126 , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
127 , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
128 , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
129 , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
130 , benchIO "drop-one" (D.dropOne 1) D.sourceUnfoldrM
131 , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
132 , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
133 , benchIO "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
135 , bgroup "filteringX4"
136 [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
137 , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
138 , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
139 , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
140 , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
141 , benchIO "drop-one" (D.dropOne 4) D.sourceUnfoldrM
142 , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
143 , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
144 , benchIO "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
147 [ benchFold "eqBy" D.eqBy D.sourceUnfoldrM
148 , benchFold "cmpBy" D.cmpBy D.sourceUnfoldrM
149 , benchIO "zip" D.zip D.sourceUnfoldrM
152 [ benchIO "scan-map" (D.scanMap 1) D.sourceUnfoldrM
153 , benchIO "drop-map" (D.dropMap 1) D.sourceUnfoldrM
154 , benchIO "drop-scan" (D.dropScan 1) D.sourceUnfoldrM
155 , benchIO "take-drop" (D.takeDrop 1) D.sourceUnfoldrM
156 , benchIO "take-scan" (D.takeScan 1) D.sourceUnfoldrM
157 , benchIO "take-map" (D.takeMap 1) D.sourceUnfoldrM
158 , benchIO "filter-drop" (D.filterDrop 1) D.sourceUnfoldrM
159 , benchIO "filter-take" (D.filterTake 1) D.sourceUnfoldrM
160 , benchIO "filter-scan" (D.filterScan 1) D.sourceUnfoldrM
161 , benchIO "filter-map" (D.filterMap 1) D.sourceUnfoldrM
164 [ benchIO "scan-map" (D.scanMap 2) D.sourceUnfoldrM
165 , benchIO "drop-map" (D.dropMap 2) D.sourceUnfoldrM
166 , benchIO "drop-scan" (D.dropScan 2) D.sourceUnfoldrM
167 , benchIO "take-drop" (D.takeDrop 2) D.sourceUnfoldrM
168 , benchIO "take-scan" (D.takeScan 2) D.sourceUnfoldrM
169 , benchIO "take-map" (D.takeMap 2) D.sourceUnfoldrM
170 , benchIO "filter-drop" (D.filterDrop 2) D.sourceUnfoldrM
171 , benchIO "filter-take" (D.filterTake 2) D.sourceUnfoldrM
172 , benchIO "filter-scan" (D.filterScan 2) D.sourceUnfoldrM
173 , benchIO "filter-map" (D.filterMap 2) D.sourceUnfoldrM
176 [ benchIO "scan-map" (D.scanMap 4) D.sourceUnfoldrM
177 , benchIO "drop-map" (D.dropMap 4) D.sourceUnfoldrM
178 , benchIO "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
179 , benchIO "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
180 , benchIO "take-scan" (D.takeScan 4) D.sourceUnfoldrM
181 , benchIO "take-map" (D.takeMap 4) D.sourceUnfoldrM
182 , benchIO "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
183 , benchIO "filter-take" (D.filterTake 4) D.sourceUnfoldrM
184 , benchIO "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
185 , benchIO "filter-map" (D.filterMap 4) D.sourceUnfoldrM
188 [ benchD "mapM" D.iterateMapM
189 , benchD "scan(1/10)" D.iterateScan
190 , benchD "filterEven" D.iterateFilterEven
191 , benchD "takeAll" D.iterateTakeAll
192 , benchD "dropOne" D.iterateDropOne
193 , benchD "dropWhileFalse(1/10)" D.iterateDropWhileFalse
194 , benchD "dropWhileTrue" D.iterateDropWhileTrue
199 [ benchPure "toNullAp" K.toNullApNestedList (K.sourceUnfoldrList K.value2)
200 , benchPure "toNull" K.toNullNestedList (K.sourceUnfoldrList K.value2)
201 , benchPure "toNull3" K.toNullNestedList3 (K.sourceUnfoldrList K.value3)
202 , benchPure "filterAllIn" K.filterAllInNestedList (K.sourceUnfoldrList K.value2)
203 , benchPure "filterAllOut" K.filterAllOutNestedList (K.sourceUnfoldrList K.value2)
207 [ bgroup "generation"
208 [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
209 , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
210 -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
212 , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
213 -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
216 , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
217 , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
219 , bgroup "elimination"
220 [ benchIO "toNull" K.toNull K.sourceUnfoldrM
221 , benchIO "mapM_" K.mapM_ K.sourceUnfoldrM
222 , benchIO "uncons" K.uncons K.sourceUnfoldrM
223 , benchFold "init" K.init K.sourceUnfoldrM
224 , benchFold "tail" K.tail K.sourceUnfoldrM
225 , benchIO "nullTail" K.nullTail K.sourceUnfoldrM
226 , benchIO "headTail" K.headTail K.sourceUnfoldrM
227 , benchFold "toList" K.toList K.sourceUnfoldrM
228 , benchFold "foldl'" K.foldl K.sourceUnfoldrM
229 , benchFold "last" K.last K.sourceUnfoldrM
232 [ benchIO "toNullAp" K.toNullApNested (K.sourceUnfoldrMN K.value2)
233 , benchIO "toNull" K.toNullNested (K.sourceUnfoldrMN K.value2)
234 , benchIO "toNull3" K.toNullNested3 (K.sourceUnfoldrMN K.value3)
235 , benchIO "filterAllIn" K.filterAllInNested (K.sourceUnfoldrMN K.value2)
236 , benchIO "filterAllOut" K.filterAllOutNested (K.sourceUnfoldrMN K.value2)
237 , benchIO "toNullApPure" K.toNullApNested (K.sourceUnfoldrN K.value2)
238 , benchIO "toNullPure" K.toNullNested (K.sourceUnfoldrN K.value2)
239 , benchIO "toNull3Pure" K.toNullNested3 (K.sourceUnfoldrN K.value3)
240 , benchIO "filterAllInPure" K.filterAllInNested (K.sourceUnfoldrN K.value2)
241 , benchIO "filterAllOutPure" K.filterAllOutNested (K.sourceUnfoldrN K.value2)
243 , bgroup "transformation"
244 [ benchIO "scan" (K.scan 1) K.sourceUnfoldrM
245 , benchIO "map" (K.map 1) K.sourceUnfoldrM
246 , benchIO "fmap" (K.fmap 1) K.sourceUnfoldrM
247 , benchIO "mapM" (K.mapM 1) K.sourceUnfoldrM
248 , benchIO "mapMSerial" (K.mapMSerial 1) K.sourceUnfoldrM
249 -- , benchIOSrcK "concatMap" K.concatMap
250 , benchIO "concatMapNxN" (K.concatMap 1) (K.sourceUnfoldrMN K.value2)
251 , benchIO "concatMapPureNxN" (K.concatMap 1) (K.sourceUnfoldrN K.value2)
252 , benchIO "concatMapRepl4xN" K.concatMapRepl4xN
253 (K.sourceUnfoldrMN (K.value `div` 4))
254 , benchIO "intersperse" (K.intersperse 1) (K.sourceUnfoldrMN K.value2)
255 , benchIO "interspersePure" (K.intersperse 1) (K.sourceUnfoldrN K.value2)
256 , benchIO "foldlS" (K.foldlS 1) K.sourceUnfoldrM
258 , bgroup "transformationX4"
259 [ benchIO "scan" (K.scan 4) K.sourceUnfoldrM
260 , benchIO "map" (K.map 4) K.sourceUnfoldrM
261 , benchIO "fmap" (K.fmap 4) K.sourceUnfoldrM
262 , benchIO "mapM" (K.mapM 4) K.sourceUnfoldrM
263 , benchIO "mapMSerial" (K.mapMSerial 4) K.sourceUnfoldrM
264 -- , benchIO "concatMap" (K.concatMap 4) (K.sourceUnfoldrMN K.value16)
265 , benchIO "intersperse" (K.intersperse 4) (K.sourceUnfoldrMN K.value16)
268 [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
269 , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
270 , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
271 , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
272 , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
273 , benchIO "drop-one" (K.dropOne 1) K.sourceUnfoldrM
274 , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
275 , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
276 , benchIO "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
278 , bgroup "filteringX4"
279 [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
280 , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
281 , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
282 , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
283 , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
284 , benchIO "drop-one" (K.dropOne 4) K.sourceUnfoldrM
285 , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
286 , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
287 , benchIO "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
290 [ benchIO "zip" K.zip K.sourceUnfoldrM
293 [ benchIO "scan-map" (K.scanMap 1) K.sourceUnfoldrM
294 , benchIO "drop-map" (K.dropMap 1) K.sourceUnfoldrM
295 , benchIO "drop-scan" (K.dropScan 1) K.sourceUnfoldrM
296 , benchIO "take-drop" (K.takeDrop 1) K.sourceUnfoldrM
297 , benchIO "take-scan" (K.takeScan 1) K.sourceUnfoldrM
298 , benchIO "take-map" (K.takeMap 1) K.sourceUnfoldrM
299 , benchIO "filter-drop" (K.filterDrop 1) K.sourceUnfoldrM
300 , benchIO "filter-take" (K.filterTake 1) K.sourceUnfoldrM
301 , benchIO "filter-scan" (K.filterScan 1) K.sourceUnfoldrM
302 , benchIO "filter-map" (K.filterMap 1) K.sourceUnfoldrM
305 [ benchIO "scan-map" (K.scanMap 2) K.sourceUnfoldrM
306 , benchIO "drop-map" (K.dropMap 2) K.sourceUnfoldrM
307 , benchIO "drop-scan" (K.dropScan 2) K.sourceUnfoldrM
308 , benchIO "take-drop" (K.takeDrop 2) K.sourceUnfoldrM
309 , benchIO "take-scan" (K.takeScan 2) K.sourceUnfoldrM
310 , benchIO "take-map" (K.takeMap 2) K.sourceUnfoldrM
311 , benchIO "filter-drop" (K.filterDrop 2) K.sourceUnfoldrM
312 , benchIO "filter-take" (K.filterTake 2) K.sourceUnfoldrM
313 , benchIO "filter-scan" (K.filterScan 2) K.sourceUnfoldrM
314 , benchIO "filter-map" (K.filterMap 2) K.sourceUnfoldrM
317 [ benchIO "scan-map" (K.scanMap 4) K.sourceUnfoldrM
318 , benchIO "drop-map" (K.dropMap 4) K.sourceUnfoldrM
319 , benchIO "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
320 , benchIO "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
321 , benchIO "take-scan" (K.takeScan 4) K.sourceUnfoldrM
322 , benchIO "take-map" (K.takeMap 4) K.sourceUnfoldrM
323 , benchIO "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
324 , benchIO "filter-take" (K.filterTake 4) K.sourceUnfoldrM
325 , benchIO "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
326 , benchIO "filter-map" (K.filterMap 4) K.sourceUnfoldrM
329 [ benchK "mapM" K.iterateMapM
330 , benchK "scan(1/10)" K.iterateScan
331 , benchK "filterEven" K.iterateFilterEven
332 , benchK "takeAll" K.iterateTakeAll
333 , benchK "dropOne" K.iterateDropOne
334 , benchK "dropWhileFalse(1/10)" K.iterateDropWhileFalse
335 , benchK "dropWhileTrue" K.iterateDropWhileTrue
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