@@ -1,368 +0,0 @@
1−-- |
2−-- Module : Main
3−-- Copyright : (c) 2018 Harendra Kumar
4−--
5−-- License : BSD3
6−-- Maintainer : streamly@composewell.com
7−
8−{-# LANGUAGE CPP #-}
9−
10−import Control.DeepSeq (NFData(..))
11−-- import Data.Functor.Identity (Identity, runIdentity)
12−import System.Random (randomRIO)
13−
14−import Gauge
15−import qualified Streamly.Benchmark.Data.Stream.StreamD as D
16−import qualified Streamly.Benchmark.Data.Stream.StreamK as K
17−import qualified Streamly.Benchmark.Data.Stream.StreamDK as DK
18−import qualified Data.List as List
19−
20−#if !MIN_VERSION_deepseq(1,4,3)
21−instance NFData Ordering where rnf = (`seq` ())
22−#endif
23−
24−-- We need a monadic bind here to make sure that the function f does not get
25−-- completely optimized out by the compiler in some cases.
26−{-# INLINE benchFold #-}
27−benchFold :: NFData b
28− => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
29−benchFold name f src = bench name $ nfIO $ randomRIO (1,1) >>= f . src
30−
31−{-# INLINE benchPure #-}
32−benchPure :: String -> ([Int] -> [Int]) -> (Int -> [Int]) -> Benchmark
33−benchPure name run f = bench name $ nfIO $ randomRIO (1,1) >>= return . run . f
34−
35−#if defined(O_N_STACK)
36−-- | Takes a source, and uses it with a default drain/fold method.
37−{-# INLINE benchD #-}
38−benchD :: String -> (Int -> D.Stream IO Int) -> Benchmark
39−benchD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
40−
41−{-# INLINE benchK #-}
42−benchK :: String -> (Int -> K.Stream IO Int) -> Benchmark
43−benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
44−#endif
45−
46−main :: IO ()
47−main =
48− defaultMain
49−#ifdef O_1_SPACE
50− [ bgroup "streamD"
51− [ bgroup "generation"
52− [ benchFold "unfoldr" D.toNull D.sourceUnfoldr
53− , benchFold "unfoldrM" D.toNull D.sourceUnfoldrM
54− , benchFold "intFromTo" D.toNull D.sourceIntFromTo
55−
56− , benchFold "fromList" D.toNull D.sourceFromList
57− -- , benchFold "fromFoldableM" D.sourceFromFoldableM
58− ]
59− , bgroup "elimination"
60− [ benchFold "toNull" D.toNull D.sourceUnfoldrM
61− , benchFold "mapM_" D.mapM_ D.sourceUnfoldrM
62− , benchFold "uncons" D.uncons D.sourceUnfoldrM
63− , benchFold "foldl'" D.foldl D.sourceUnfoldrM
64− , benchFold "last" D.last D.sourceUnfoldrM
65− ]
66− , bgroup "nested"
67− [ benchFold "toNullAp" D.toNullApNested (D.sourceUnfoldrMN D.value2)
68− , benchFold "toNull" D.toNullNested (D.sourceUnfoldrMN D.value2)
69− , benchFold "toNull3" D.toNullNested3 (D.sourceUnfoldrMN D.value3)
70− , benchFold "filterAllIn" D.filterAllInNested (D.sourceUnfoldrMN K.value2)
71− , benchFold "filterAllOut" D.filterAllOutNested (D.sourceUnfoldrMN K.value2)
72− , benchFold "toNullApPure" D.toNullApNested (D.sourceUnfoldrN K.value2)
73− , benchFold "toNullPure" D.toNullNested (D.sourceUnfoldrN K.value2)
74− , benchFold "toNull3Pure" D.toNullNested3 (D.sourceUnfoldrN K.value3)
75− , benchFold "filterAllInPure" D.filterAllInNested (D.sourceUnfoldrN K.value2)
76− , benchFold "filterAllOutPure" D.filterAllOutNested (D.sourceUnfoldrN K.value2)
77− ]
78− , bgroup "transformation"
79− [ benchFold "scan" (D.scan 1) D.sourceUnfoldrM
80− , benchFold "map" (D.map 1) D.sourceUnfoldrM
81− , benchFold "fmap" (D.fmap 1) D.sourceUnfoldrM
82− , benchFold "mapM" (D.mapM 1) D.sourceUnfoldrM
83− , benchFold "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
84− , benchFold "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
85− , benchFold "concatMapNxN" (D.concatMap 1) (D.sourceUnfoldrMN D.value2)
86− , benchFold "concatMapRepl4xN" D.concatMapRepl4xN
87− (D.sourceUnfoldrMN (D.value `div` 4))
88− , benchFold "concatMapPureNxN" (D.concatMap 1) (D.sourceUnfoldrN D.value2)
89− , benchFold "concatMapURepl4xN" D.concatMapURepl4xN
90− (D.sourceUnfoldrMN (D.value `div` 4))
91− -- , benchFold "intersperse" (D.intersperse 1) (D.sourceUnfoldrMN D.value2)
92− -- , benchFold "interspersePure" (D.intersperse 1) (D.sourceUnfoldrN D.value2)
93− -- , benchFold "foldrS" (D.foldrS 1) D.sourceUnfoldrM
94− -- This has horrible performance, never finishes
95− -- , benchFold "foldlS" (D.foldlS 1) D.sourceUnfoldrM
96− ]
97− , bgroup "transformationX4"
98− [ benchFold "scan" (D.scan 4) D.sourceUnfoldrM
99− , benchFold "map" (D.map 4) D.sourceUnfoldrM
100− , benchFold "fmap" (D.fmap 4) D.sourceUnfoldrM
101− , benchFold "mapM" (D.mapM 4) D.sourceUnfoldrM
102− , benchFold "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
103− , benchFold "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
104− -- , benchFold "concatMap" (D.concatMap 4) (D.sourceUnfoldrMN D.value16)
105− -- , benchFold "intersperse" (D.intersperse 4) (D.sourceUnfoldrMN D.value16)
106− ]
107− , bgroup "filtering"
108− [ benchFold "filter-even" (D.filterEven 1) D.sourceUnfoldrM
109− , benchFold "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
110− , benchFold "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
111− , benchFold "take-all" (D.takeAll 1) D.sourceUnfoldrM
112− , benchFold "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
113− , benchFold "drop-one" (D.dropOne 1) D.sourceUnfoldrM
114− , benchFold "drop-all" (D.dropAll 1) D.sourceUnfoldrM
115− , benchFold "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
116− , benchFold "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
117− ]
118− , bgroup "filteringX4"
119− [ benchFold "filter-even" (D.filterEven 4) D.sourceUnfoldrM
120− , benchFold "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
121− , benchFold "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
122− , benchFold "take-all" (D.takeAll 4) D.sourceUnfoldrM
123− , benchFold "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
124− , benchFold "drop-one" (D.dropOne 4) D.sourceUnfoldrM
125− , benchFold "drop-all" (D.dropAll 4) D.sourceUnfoldrM
126− , benchFold "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
127− , benchFold "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
128− ]
129− , bgroup "zipping"
130− [ benchFold "eqBy" D.eqBy D.sourceUnfoldrM
131− , benchFold "cmpBy" D.cmpBy D.sourceUnfoldrM
132− , benchFold "zip" D.zip D.sourceUnfoldrM
133− ]
134− , bgroup "mixed"
135− [ benchFold "scan-map" (D.scanMap 1) D.sourceUnfoldrM
136− , benchFold "drop-map" (D.dropMap 1) D.sourceUnfoldrM
137− , benchFold "drop-scan" (D.dropScan 1) D.sourceUnfoldrM
138− , benchFold "take-drop" (D.takeDrop 1) D.sourceUnfoldrM
139− , benchFold "take-scan" (D.takeScan 1) D.sourceUnfoldrM
140− , benchFold "take-map" (D.takeMap 1) D.sourceUnfoldrM
141− , benchFold "filter-drop" (D.filterDrop 1) D.sourceUnfoldrM
142− , benchFold "filter-take" (D.filterTake 1) D.sourceUnfoldrM
143− , benchFold "filter-scan" (D.filterScan 1) D.sourceUnfoldrM
144− , benchFold "filter-map" (D.filterMap 1) D.sourceUnfoldrM
145− ]
146− , bgroup "mixedX2"
147− [ benchFold "scan-map" (D.scanMap 2) D.sourceUnfoldrM
148− , benchFold "drop-map" (D.dropMap 2) D.sourceUnfoldrM
149− , benchFold "drop-scan" (D.dropScan 2) D.sourceUnfoldrM
150− , benchFold "take-drop" (D.takeDrop 2) D.sourceUnfoldrM
151− , benchFold "take-scan" (D.takeScan 2) D.sourceUnfoldrM
152− , benchFold "take-map" (D.takeMap 2) D.sourceUnfoldrM
153− , benchFold "filter-drop" (D.filterDrop 2) D.sourceUnfoldrM
154− , benchFold "filter-take" (D.filterTake 2) D.sourceUnfoldrM
155− , benchFold "filter-scan" (D.filterScan 2) D.sourceUnfoldrM
156− , benchFold "filter-map" (D.filterMap 2) D.sourceUnfoldrM
157− ]
158− , bgroup "mixedX4"
159− [ benchFold "scan-map" (D.scanMap 4) D.sourceUnfoldrM
160− , benchFold "drop-map" (D.dropMap 4) D.sourceUnfoldrM
161− , benchFold "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
162− , benchFold "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
163− , benchFold "take-scan" (D.takeScan 4) D.sourceUnfoldrM
164− , benchFold "take-map" (D.takeMap 4) D.sourceUnfoldrM
165− , benchFold "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
166− , benchFold "filter-take" (D.filterTake 4) D.sourceUnfoldrM
167− , benchFold "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
168− , benchFold "filter-map" (D.filterMap 4) D.sourceUnfoldrM
169− ]
170− ]
171− , bgroup "list"
172− [ bgroup "elimination"
173− [ benchPure "last" (\xs -> [List.last xs]) (K.sourceUnfoldrList K.value)
174− ]
175− , bgroup "nested"
176− [ benchPure "toNullAp" K.toNullApNestedList (K.sourceUnfoldrList K.value2)
177− , benchPure "toNull" K.toNullNestedList (K.sourceUnfoldrList K.value2)
178− , benchPure "toNull3" K.toNullNestedList3 (K.sourceUnfoldrList K.value3)
179− , benchPure "filterAllIn" K.filterAllInNestedList (K.sourceUnfoldrList K.value2)
180− , benchPure "filterAllOut" K.filterAllOutNestedList (K.sourceUnfoldrList K.value2)
181− ]
182− ]
183− , bgroup "streamK"
184− [ bgroup "generation"
185− [ benchFold "unfoldr" K.toNull K.sourceUnfoldr
186− , benchFold "unfoldrM" K.toNull K.sourceUnfoldrM
187− -- , benchFold "fromEnum" K.toNull K.sourceFromEnum
188−
189− , benchFold "fromFoldable" K.toNull K.sourceFromFoldable
190− -- , benchFold "fromFoldableM" K.toNull K.sourceFromFoldableM
191−
192− -- appends
193− , benchFold "foldMapWith" K.toNull K.sourceFoldMapWith
194− , benchFold "foldMapWithM" K.toNull K.sourceFoldMapWithM
195− ]
196− , bgroup "elimination"
197− [ benchFold "toNull" K.toNull K.sourceUnfoldrM
198− , benchFold "mapM_" K.mapM_ K.sourceUnfoldrM
199− , benchFold "uncons" K.uncons K.sourceUnfoldrM
200− , benchFold "init" K.init K.sourceUnfoldrM
201− , benchFold "foldl'" K.foldl K.sourceUnfoldrM
202− , benchFold "last" K.last K.sourceUnfoldrM
203− ]
204− , bgroup "nested"
205− [ benchFold "toNullAp" K.toNullApNested (K.sourceUnfoldrMN K.value2)
206− , benchFold "toNull" K.toNullNested (K.sourceUnfoldrMN K.value2)
207− , benchFold "toNull3" K.toNullNested3 (K.sourceUnfoldrMN K.value3)
208− , benchFold "filterAllIn" K.filterAllInNested (K.sourceUnfoldrMN K.value2)
209− , benchFold "filterAllOut" K.filterAllOutNested (K.sourceUnfoldrMN K.value2)
210− , benchFold "toNullApPure" K.toNullApNested (K.sourceUnfoldrN K.value2)
211− , benchFold "toNullPure" K.toNullNested (K.sourceUnfoldrN K.value2)
212− , benchFold "toNull3Pure" K.toNullNested3 (K.sourceUnfoldrN K.value3)
213− , benchFold "filterAllInPure" K.filterAllInNested (K.sourceUnfoldrN K.value2)
214− , benchFold "filterAllOutPure" K.filterAllOutNested (K.sourceUnfoldrN K.value2)
215− ]
216− , bgroup "transformation"
217− [ benchFold "scan" (K.scan 1) K.sourceUnfoldrM
218− , benchFold "map" (K.map 1) K.sourceUnfoldrM
219− , benchFold "fmap" (K.fmap 1) K.sourceUnfoldrM
220− , benchFold "mapM" (K.mapM 1) K.sourceUnfoldrM
221− , benchFold "mapMSerial" (K.mapMSerial 1) K.sourceUnfoldrM
222− -- , benchFoldSrcK "concatMap" K.concatMap
223− , benchFold "concatMapNxN" (K.concatMap 1) (K.sourceUnfoldrMN K.value2)
224− , benchFold "concatMapPureNxN" (K.concatMap 1) (K.sourceUnfoldrN K.value2)
225− , benchFold "concatMapRepl4xN" K.concatMapRepl4xN
226− (K.sourceUnfoldrMN (K.value `div` 4))
227− -- , benchFold "intersperse" (K.intersperse 1) (K.sourceUnfoldrMN K.value2)
228− -- , benchFold "interspersePure" (K.intersperse 1) (K.sourceUnfoldrN K.value2)
229− ]
230− , bgroup "transformationX4"
231− [ benchFold "scan" (K.scan 4) K.sourceUnfoldrM
232− , benchFold "map" (K.map 4) K.sourceUnfoldrM
233− , benchFold "fmap" (K.fmap 4) K.sourceUnfoldrM
234− , benchFold "mapM" (K.mapM 4) K.sourceUnfoldrM
235− , benchFold "mapMSerial" (K.mapMSerial 4) K.sourceUnfoldrM
236− -- , benchFold "concatMap" (K.concatMap 4) (K.sourceUnfoldrMN K.value16)
237− -- , benchFold "intersperse" (K.intersperse 4) (K.sourceUnfoldrMN K.value16)
238− ]
239− , bgroup "filtering"
240− [ benchFold "filter-even" (K.filterEven 1) K.sourceUnfoldrM
241− , benchFold "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
242− , benchFold "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
243− , benchFold "take-all" (K.takeAll 1) K.sourceUnfoldrM
244− , benchFold "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
245− , benchFold "drop-one" (K.dropOne 1) K.sourceUnfoldrM
246− , benchFold "drop-all" (K.dropAll 1) K.sourceUnfoldrM
247− , benchFold "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
248− , benchFold "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
249− ]
250− , bgroup "filteringX4"
251− [ benchFold "filter-even" (K.filterEven 4) K.sourceUnfoldrM
252− , benchFold "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
253− , benchFold "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
254− , benchFold "take-all" (K.takeAll 4) K.sourceUnfoldrM
255− , benchFold "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
256− , benchFold "drop-one" (K.dropOne 4) K.sourceUnfoldrM
257− , benchFold "drop-all" (K.dropAll 4) K.sourceUnfoldrM
258− , benchFold "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
259− , benchFold "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
260− ]
261− , bgroup "zipping"
262− [ benchFold "zip" K.zip K.sourceUnfoldrM
263− ]
264− , bgroup "mixed"
265− [ benchFold "scan-map" (K.scanMap 1) K.sourceUnfoldrM
266− , benchFold "drop-map" (K.dropMap 1) K.sourceUnfoldrM
267− , benchFold "drop-scan" (K.dropScan 1) K.sourceUnfoldrM
268− , benchFold "take-drop" (K.takeDrop 1) K.sourceUnfoldrM
269− , benchFold "take-scan" (K.takeScan 1) K.sourceUnfoldrM
270− , benchFold "take-map" (K.takeMap 1) K.sourceUnfoldrM
271− , benchFold "filter-drop" (K.filterDrop 1) K.sourceUnfoldrM
272− , benchFold "filter-take" (K.filterTake 1) K.sourceUnfoldrM
273− , benchFold "filter-scan" (K.filterScan 1) K.sourceUnfoldrM
274− , benchFold "filter-map" (K.filterMap 1) K.sourceUnfoldrM
275− ]
276− , bgroup "mixedX2"
277− [ benchFold "scan-map" (K.scanMap 2) K.sourceUnfoldrM
278− , benchFold "drop-map" (K.dropMap 2) K.sourceUnfoldrM
279− , benchFold "drop-scan" (K.dropScan 2) K.sourceUnfoldrM
280− , benchFold "take-drop" (K.takeDrop 2) K.sourceUnfoldrM
281− , benchFold "take-scan" (K.takeScan 2) K.sourceUnfoldrM
282− , benchFold "take-map" (K.takeMap 2) K.sourceUnfoldrM
283− , benchFold "filter-drop" (K.filterDrop 2) K.sourceUnfoldrM
284− , benchFold "filter-take" (K.filterTake 2) K.sourceUnfoldrM
285− , benchFold "filter-scan" (K.filterScan 2) K.sourceUnfoldrM
286− , benchFold "filter-map" (K.filterMap 2) K.sourceUnfoldrM
287− ]
288− , bgroup "mixedX4"
289− [ benchFold "scan-map" (K.scanMap 4) K.sourceUnfoldrM
290− , benchFold "drop-map" (K.dropMap 4) K.sourceUnfoldrM
291− , benchFold "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
292− , benchFold "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
293− , benchFold "take-scan" (K.takeScan 4) K.sourceUnfoldrM
294− , benchFold "take-map" (K.takeMap 4) K.sourceUnfoldrM
295− , benchFold "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
296− , benchFold "filter-take" (K.filterTake 4) K.sourceUnfoldrM
297− , benchFold "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
298− , benchFold "filter-map" (K.filterMap 4) K.sourceUnfoldrM
299− ]
300− ]
301− , bgroup "streamDK"
302− [ bgroup "generation"
303− [ benchFold "unfoldr" DK.toNull DK.sourceUnfoldr
304− , benchFold "unfoldrM" DK.toNull DK.sourceUnfoldrM
305− ]
306− , bgroup "elimination"
307− [ benchFold "toNull" DK.toNull DK.sourceUnfoldrM
308− , benchFold "uncons" DK.uncons DK.sourceUnfoldrM
309− ]
310− ]
311− ]
312−#elif defined(O_N_HEAP)
313− [ bgroup "streamK"
314− [ bgroup "transformation"
315− [ benchFold "foldlS" (K.foldlS 1) K.sourceUnfoldrM
316− ]
317− ]
318− ]
319−#elif defined(O_N_STACK)
320− [ bgroup "streamD"
321− [ bgroup "elimination"
322− [ benchFold "tail" D.tail D.sourceUnfoldrM
323− , benchFold "nullTail" D.nullTail D.sourceUnfoldrM
324− , benchFold "headTail" D.headTail D.sourceUnfoldrM
325− ]
326− , bgroup "iterated"
327− [ benchD "mapM" D.iterateMapM
328− , benchD "scan(1/10)" D.iterateScan
329− , benchD "filterEven" D.iterateFilterEven
330− , benchD "takeAll" D.iterateTakeAll
331− , benchD "dropOne" D.iterateDropOne
332− , benchD "dropWhileFalse(1/10)" D.iterateDropWhileFalse
333− , benchD "dropWhileTrue" D.iterateDropWhileTrue
334− , benchD "iterateM" D.iterateM
335− ]
336− ]
337− , bgroup "streamK"
338− [ bgroup "elimination"
339− [ benchFold "tail" K.tail K.sourceUnfoldrM
340− , benchFold "nullTail" K.nullTail K.sourceUnfoldrM
341− , benchFold "headTail" K.headTail K.sourceUnfoldrM
342− ]
343− , bgroup "iterated"
344− [ benchK "mapM" K.iterateMapM
345− , benchK "scan(1/10)" K.iterateScan
346− , benchK "filterEven" K.iterateFilterEven
347− , benchK "takeAll" K.iterateTakeAll
348− , benchK "dropOne" K.iterateDropOne
349− , benchK "dropWhileFalse(1/10)" K.iterateDropWhileFalse
350− , benchK "dropWhileTrue" K.iterateDropWhileTrue
351− ]
352− ]
353− ]
354−#elif defined(O_N_SPACE)
355− [ bgroup "streamD"
356− [ bgroup "elimination"
357− [ benchFold "toList" D.toList D.sourceUnfoldrM
358− ]
359− ]
360− , bgroup "streamK"
361− [ bgroup "elimination"
362− [ benchFold "toList" K.toList K.sourceUnfoldrM
363− ]
364− ]
365− ]
366−#else
367−#error "One of O_1_SPACE/O_N_HEAP/O_N_STACK/O_N_SPACE must be defined"
368−#endif