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