on master help sign in
classify "base" stream benchmarks by space usage
commitae30f2fc9e35a37e2ce9ed934eece0af217bac7f authorHarendra Kumar <harendra.kumar@gmail.com> dateThu 20 Feb 2020, 02:52 (7 years ago) parent7ce2dc8
5 files changed+297−273
benchmark/BaseStreams.hs+243−255 benchmark/StreamDOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamD.hs+2−2 benchmark/StreamDKOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamDK.hs+2−2 benchmark/StreamKOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamK.hs+2−2 benchmark/streamly-benchmarks.cabal+48−12
benchmark/BaseStreams.hs+243−255
@@ -12,9 +12,9 @@ import Control.DeepSeq (NFData(..))
1212import System.Random (randomRIO)
1313
1414import Gauge
15−import qualified StreamDOps as D
16−import qualified StreamKOps as K
17−import qualified StreamDKOps as DK
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
1818import qualified Data.List as List
1919
2020#if !MIN_VERSION_deepseq(1,4,3)
@@ -23,29 +23,16 @@ instance NFData Ordering where rnf = (`seq` ())
2323
2424-- We need a monadic bind here to make sure that the function f does not get
2525-- completely optimized out by the compiler in some cases.
26−{-# INLINE benchIO #-}
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
29−
30−{-# INLINE _benchIOSrcK #-}
31−_benchIOSrcK
32− :: String
33− -> (Int -> K.Stream IO Int)
34− -> Benchmark
35−_benchIOSrcK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
36−
37−{-# INLINE _benchIOSrcD #-}
38−_benchIOSrcD
39− :: String
40− -> (Int -> D.Stream IO Int)
41− -> Benchmark
42−_benchIOSrcD name f = bench name $ nfIO $ randomRIO (1,1) >>= D.toNull . f
43−
26+{-# INLINE benchFold #-}
4427benchFold :: NFData b
4528 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
4629benchFold name f src = bench name $ nfIO $ randomRIO (1,1) >>= f . src
4730
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
34+
35+#if defined(O_N_STACK)
4936-- | Takes a source, and uses it with a default drain/fold method.
5037{-# INLINE benchD #-}
5138benchD :: String -> (Int -> D.Stream IO Int) -> Benchmark
@@ -56,161 +43,130 @@ benchK :: String -> (Int -> K.Stream IO Int) -> Benchmark
5643benchK name f = bench name $ nfIO $ randomRIO (1,1) >>= K.toNull . f
5744#endif
5845
59−{-
60−_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
61−_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
62−-}
63−
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
67−
6846main :: IO ()
6947main =
7048 defaultMain
49+#ifdef O_1_SPACE
7150 [ bgroup "streamD"
7251 [ bgroup "generation"
73− [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
74− , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
75− , benchIO "intFromTo" D.toNull D.sourceIntFromTo
52+ [ benchFold "unfoldr" D.toNull D.sourceUnfoldr
53+ , benchFold "unfoldrM" D.toNull D.sourceUnfoldrM
54+ , benchFold "intFromTo" D.toNull D.sourceIntFromTo
7655
77− , benchIO "fromList" D.toNull D.sourceFromList
78− -- , benchIO "fromFoldableM" D.sourceFromFoldableM
56+ , benchFold "fromList" D.toNull D.sourceFromList
57+ -- , benchFold "fromFoldableM" D.sourceFromFoldableM
7958 ]
8059 , bgroup "elimination"
81− [ benchIO "toNull" D.toNull D.sourceUnfoldrM
82− , benchIO "mapM_" D.mapM_ D.sourceUnfoldrM
83− , benchIO "uncons" D.uncons D.sourceUnfoldrM
84−#ifdef DEVBUILD
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
91−#endif
60+ [ benchFold "toNull" D.toNull D.sourceUnfoldrM
61+ , benchFold "mapM_" D.mapM_ D.sourceUnfoldrM
62+ , benchFold "uncons" D.uncons D.sourceUnfoldrM
9263 , benchFold "foldl'" D.foldl D.sourceUnfoldrM
9364 , benchFold "last" D.last D.sourceUnfoldrM
9465 ]
9566 , bgroup "nested"
96− [ benchIO "toNullAp" D.toNullApNested (D.sourceUnfoldrMN D.value2)
97− , benchIO "toNull" D.toNullNested (D.sourceUnfoldrMN D.value2)
98− , benchIO "toNull3" D.toNullNested3 (D.sourceUnfoldrMN D.value3)
99− , benchIO "filterAllIn" D.filterAllInNested (D.sourceUnfoldrMN K.value2)
100− , benchIO "filterAllOut" D.filterAllOutNested (D.sourceUnfoldrMN K.value2)
101− , benchIO "toNullApPure" D.toNullApNested (D.sourceUnfoldrN K.value2)
102− , benchIO "toNullPure" D.toNullNested (D.sourceUnfoldrN K.value2)
103− , benchIO "toNull3Pure" D.toNullNested3 (D.sourceUnfoldrN K.value3)
104− , benchIO "filterAllInPure" D.filterAllInNested (D.sourceUnfoldrN K.value2)
105− , benchIO "filterAllOutPure" D.filterAllOutNested (D.sourceUnfoldrN K.value2)
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)
10677 ]
10778 , bgroup "transformation"
108− [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
109− , benchIO "map" (D.map 1) D.sourceUnfoldrM
110− , benchIO "fmap" (D.fmap 1) D.sourceUnfoldrM
111− , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
112− , benchIO "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
113− , benchIO "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
114− , benchIO "concatMapNxN" (D.concatMap 1) (D.sourceUnfoldrMN D.value2)
115− , benchIO "concatMapRepl4xN" D.concatMapRepl4xN
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
11687 (D.sourceUnfoldrMN (D.value `div` 4))
117− , benchIO "concatMapPureNxN" (D.concatMap 1) (D.sourceUnfoldrN D.value2)
118− , benchIO "concatMapURepl4xN" D.concatMapURepl4xN
88+ , benchFold "concatMapPureNxN" (D.concatMap 1) (D.sourceUnfoldrN D.value2)
89+ , benchFold "concatMapURepl4xN" D.concatMapURepl4xN
11990 (D.sourceUnfoldrMN (D.value `div` 4))
120− , benchIO "intersperse" (D.intersperse 1) (D.sourceUnfoldrMN D.value2)
121− , benchIO "interspersePure" (D.intersperse 1) (D.sourceUnfoldrN D.value2)
122− -- , benchIO "foldrS" (D.foldrS 1) D.sourceUnfoldrM
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
12394 -- This has horrible performance, never finishes
124− -- , benchIO "foldlS" (D.foldlS 1) D.sourceUnfoldrM
95+ -- , benchFold "foldlS" (D.foldlS 1) D.sourceUnfoldrM
12596 ]
12697 , bgroup "transformationX4"
127− [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
128− , benchIO "map" (D.map 4) D.sourceUnfoldrM
129− , benchIO "fmap" (D.fmap 4) D.sourceUnfoldrM
130− , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
131− , benchIO "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
132− , benchIO "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
133− -- , benchIO "concatMap" (D.concatMap 4) (D.sourceUnfoldrMN D.value16)
134− , benchIO "intersperse" (D.intersperse 4) (D.sourceUnfoldrMN D.value16)
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)
135106 ]
136107 , bgroup "filtering"
137− [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
138− , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
139− , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
140− , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
141− , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
142− , benchIO "drop-one" (D.dropOne 1) D.sourceUnfoldrM
143− , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
144− , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
145− , benchIO "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
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
146117 ]
147118 , bgroup "filteringX4"
148− [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
149− , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
150− , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
151− , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
152− , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
153− , benchIO "drop-one" (D.dropOne 4) D.sourceUnfoldrM
154− , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
155− , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
156− , benchIO "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
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
157128 ]
158129 , bgroup "zipping"
159130 [ benchFold "eqBy" D.eqBy D.sourceUnfoldrM
160131 , benchFold "cmpBy" D.cmpBy D.sourceUnfoldrM
161− , benchIO "zip" D.zip D.sourceUnfoldrM
132+ , benchFold "zip" D.zip D.sourceUnfoldrM
162133 ]
163134 , bgroup "mixed"
164− [ benchIO "scan-map" (D.scanMap 1) D.sourceUnfoldrM
165− , benchIO "drop-map" (D.dropMap 1) D.sourceUnfoldrM
166− , benchIO "drop-scan" (D.dropScan 1) D.sourceUnfoldrM
167− , benchIO "take-drop" (D.takeDrop 1) D.sourceUnfoldrM
168− , benchIO "take-scan" (D.takeScan 1) D.sourceUnfoldrM
169− , benchIO "take-map" (D.takeMap 1) D.sourceUnfoldrM
170− , benchIO "filter-drop" (D.filterDrop 1) D.sourceUnfoldrM
171− , benchIO "filter-take" (D.filterTake 1) D.sourceUnfoldrM
172− , benchIO "filter-scan" (D.filterScan 1) D.sourceUnfoldrM
173− , benchIO "filter-map" (D.filterMap 1) D.sourceUnfoldrM
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
174145 ]
175146 , bgroup "mixedX2"
176− [ benchIO "scan-map" (D.scanMap 2) D.sourceUnfoldrM
177− , benchIO "drop-map" (D.dropMap 2) D.sourceUnfoldrM
178− , benchIO "drop-scan" (D.dropScan 2) D.sourceUnfoldrM
179− , benchIO "take-drop" (D.takeDrop 2) D.sourceUnfoldrM
180− , benchIO "take-scan" (D.takeScan 2) D.sourceUnfoldrM
181− , benchIO "take-map" (D.takeMap 2) D.sourceUnfoldrM
182− , benchIO "filter-drop" (D.filterDrop 2) D.sourceUnfoldrM
183− , benchIO "filter-take" (D.filterTake 2) D.sourceUnfoldrM
184− , benchIO "filter-scan" (D.filterScan 2) D.sourceUnfoldrM
185− , benchIO "filter-map" (D.filterMap 2) D.sourceUnfoldrM
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
186157 ]
187158 , bgroup "mixedX4"
188− [ benchIO "scan-map" (D.scanMap 4) D.sourceUnfoldrM
189− , benchIO "drop-map" (D.dropMap 4) D.sourceUnfoldrM
190− , benchIO "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
191− , benchIO "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
192− , benchIO "take-scan" (D.takeScan 4) D.sourceUnfoldrM
193− , benchIO "take-map" (D.takeMap 4) D.sourceUnfoldrM
194− , benchIO "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
195− , benchIO "filter-take" (D.filterTake 4) D.sourceUnfoldrM
196− , benchIO "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
197− , benchIO "filter-map" (D.filterMap 4) D.sourceUnfoldrM
198− ]
199−#ifdef DEVBUILD
200− -- XXX these consume too much stack space, need to fix or segregate in
201− -- another benchmark.
202− , bgroup "iterated"
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
211−
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
212169 ]
213−#endif
214170 ]
215171 , bgroup "list"
216172 [ bgroup "elimination"
@@ -226,136 +182,164 @@ main =
226182 ]
227183 , bgroup "streamK"
228184 [ bgroup "generation"
229− [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
230− , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
231− -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
185+ [ benchFold "unfoldr" K.toNull K.sourceUnfoldr
186+ , benchFold "unfoldrM" K.toNull K.sourceUnfoldrM
187+ -- , benchFold "fromEnum" K.toNull K.sourceFromEnum
232188
233− , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
234− -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
189+ , benchFold "fromFoldable" K.toNull K.sourceFromFoldable
190+ -- , benchFold "fromFoldableM" K.toNull K.sourceFromFoldableM
235191
236192 -- appends
237− , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
238− , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
193+ , benchFold "foldMapWith" K.toNull K.sourceFoldMapWith
194+ , benchFold "foldMapWithM" K.toNull K.sourceFoldMapWithM
239195 ]
240196 , bgroup "elimination"
241− [ benchIO "toNull" K.toNull K.sourceUnfoldrM
242− , benchIO "mapM_" K.mapM_ K.sourceUnfoldrM
243− , benchIO "uncons" K.uncons K.sourceUnfoldrM
197+ [ benchFold "toNull" K.toNull K.sourceUnfoldrM
198+ , benchFold "mapM_" K.mapM_ K.sourceUnfoldrM
199+ , benchFold "uncons" K.uncons K.sourceUnfoldrM
244200 , benchFold "init" K.init K.sourceUnfoldrM
245−#ifdef DEVBUILD
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
252−#endif
253201 , benchFold "foldl'" K.foldl K.sourceUnfoldrM
254202 , benchFold "last" K.last K.sourceUnfoldrM
255203 ]
256204 , bgroup "nested"
257− [ benchIO "toNullAp" K.toNullApNested (K.sourceUnfoldrMN K.value2)
258− , benchIO "toNull" K.toNullNested (K.sourceUnfoldrMN K.value2)
259− , benchIO "toNull3" K.toNullNested3 (K.sourceUnfoldrMN K.value3)
260− , benchIO "filterAllIn" K.filterAllInNested (K.sourceUnfoldrMN K.value2)
261− , benchIO "filterAllOut" K.filterAllOutNested (K.sourceUnfoldrMN K.value2)
262− , benchIO "toNullApPure" K.toNullApNested (K.sourceUnfoldrN K.value2)
263− , benchIO "toNullPure" K.toNullNested (K.sourceUnfoldrN K.value2)
264− , benchIO "toNull3Pure" K.toNullNested3 (K.sourceUnfoldrN K.value3)
265− , benchIO "filterAllInPure" K.filterAllInNested (K.sourceUnfoldrN K.value2)
266− , benchIO "filterAllOutPure" K.filterAllOutNested (K.sourceUnfoldrN K.value2)
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)
267215 ]
268216 , bgroup "transformation"
269− [ benchIO "scan" (K.scan 1) K.sourceUnfoldrM
270− , benchIO "map" (K.map 1) K.sourceUnfoldrM
271− , benchIO "fmap" (K.fmap 1) K.sourceUnfoldrM
272− , benchIO "mapM" (K.mapM 1) K.sourceUnfoldrM
273− , benchIO "mapMSerial" (K.mapMSerial 1) K.sourceUnfoldrM
274− -- , benchIOSrcK "concatMap" K.concatMap
275− , benchIO "concatMapNxN" (K.concatMap 1) (K.sourceUnfoldrMN K.value2)
276− , benchIO "concatMapPureNxN" (K.concatMap 1) (K.sourceUnfoldrN K.value2)
277− , benchIO "concatMapRepl4xN" K.concatMapRepl4xN
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
278226 (K.sourceUnfoldrMN (K.value `div` 4))
279− , benchIO "intersperse" (K.intersperse 1) (K.sourceUnfoldrMN K.value2)
280− , benchIO "interspersePure" (K.intersperse 1) (K.sourceUnfoldrN K.value2)
281−#ifdef DEVBUILD
282− -- XXX this consumes too much heap
283− , benchIO "foldlS" (K.foldlS 1) K.sourceUnfoldrM
284−#endif
227+ -- , benchFold "intersperse" (K.intersperse 1) (K.sourceUnfoldrMN K.value2)
228+ -- , benchFold "interspersePure" (K.intersperse 1) (K.sourceUnfoldrN K.value2)
285229 ]
286230 , bgroup "transformationX4"
287− [ benchIO "scan" (K.scan 4) K.sourceUnfoldrM
288− , benchIO "map" (K.map 4) K.sourceUnfoldrM
289− , benchIO "fmap" (K.fmap 4) K.sourceUnfoldrM
290− , benchIO "mapM" (K.mapM 4) K.sourceUnfoldrM
291− , benchIO "mapMSerial" (K.mapMSerial 4) K.sourceUnfoldrM
292− -- , benchIO "concatMap" (K.concatMap 4) (K.sourceUnfoldrMN K.value16)
293− , benchIO "intersperse" (K.intersperse 4) (K.sourceUnfoldrMN K.value16)
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)
294238 ]
295239 , bgroup "filtering"
296− [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
297− , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
298− , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
299− , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
300− , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
301− , benchIO "drop-one" (K.dropOne 1) K.sourceUnfoldrM
302− , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
303− , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
304− , benchIO "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
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
305249 ]
306250 , bgroup "filteringX4"
307− [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
308− , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
309− , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
310− , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
311− , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
312− , benchIO "drop-one" (K.dropOne 4) K.sourceUnfoldrM
313− , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
314− , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
315− , benchIO "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
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
316260 ]
317261 , bgroup "zipping"
318− [ benchIO "zip" K.zip K.sourceUnfoldrM
262+ [ benchFold "zip" K.zip K.sourceUnfoldrM
319263 ]
320264 , bgroup "mixed"
321− [ benchIO "scan-map" (K.scanMap 1) K.sourceUnfoldrM
322− , benchIO "drop-map" (K.dropMap 1) K.sourceUnfoldrM
323− , benchIO "drop-scan" (K.dropScan 1) K.sourceUnfoldrM
324− , benchIO "take-drop" (K.takeDrop 1) K.sourceUnfoldrM
325− , benchIO "take-scan" (K.takeScan 1) K.sourceUnfoldrM
326− , benchIO "take-map" (K.takeMap 1) K.sourceUnfoldrM
327− , benchIO "filter-drop" (K.filterDrop 1) K.sourceUnfoldrM
328− , benchIO "filter-take" (K.filterTake 1) K.sourceUnfoldrM
329− , benchIO "filter-scan" (K.filterScan 1) K.sourceUnfoldrM
330− , benchIO "filter-map" (K.filterMap 1) K.sourceUnfoldrM
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
331275 ]
332276 , bgroup "mixedX2"
333− [ benchIO "scan-map" (K.scanMap 2) K.sourceUnfoldrM
334− , benchIO "drop-map" (K.dropMap 2) K.sourceUnfoldrM
335− , benchIO "drop-scan" (K.dropScan 2) K.sourceUnfoldrM
336− , benchIO "take-drop" (K.takeDrop 2) K.sourceUnfoldrM
337− , benchIO "take-scan" (K.takeScan 2) K.sourceUnfoldrM
338− , benchIO "take-map" (K.takeMap 2) K.sourceUnfoldrM
339− , benchIO "filter-drop" (K.filterDrop 2) K.sourceUnfoldrM
340− , benchIO "filter-take" (K.filterTake 2) K.sourceUnfoldrM
341− , benchIO "filter-scan" (K.filterScan 2) K.sourceUnfoldrM
342− , benchIO "filter-map" (K.filterMap 2) K.sourceUnfoldrM
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
343287 ]
344288 , bgroup "mixedX4"
345− [ benchIO "scan-map" (K.scanMap 4) K.sourceUnfoldrM
346− , benchIO "drop-map" (K.dropMap 4) K.sourceUnfoldrM
347− , benchIO "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
348− , benchIO "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
349− , benchIO "take-scan" (K.takeScan 4) K.sourceUnfoldrM
350− , benchIO "take-map" (K.takeMap 4) K.sourceUnfoldrM
351− , benchIO "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
352− , benchIO "filter-take" (K.filterTake 4) K.sourceUnfoldrM
353− , benchIO "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
354− , benchIO "filter-map" (K.filterMap 4) K.sourceUnfoldrM
355− ]
356−#ifdef DEVBUILD
357− -- XXX these consume too much stack space, need to fix or segregate in
358− -- another benchmark.
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+ ]
359343 , bgroup "iterated"
360344 [ benchK "mapM" K.iterateMapM
361345 , benchK "scan(1/10)" K.iterateScan
@@ -365,16 +349,20 @@ main =
365349 , benchK "dropWhileFalse(1/10)" K.iterateDropWhileFalse
366350 , benchK "dropWhileTrue" K.iterateDropWhileTrue
367351 ]
368−#endif
369352 ]
370− , bgroup "streamDK"
371− [ bgroup "generation"
372− [ benchIO "unfoldr" DK.toNull DK.sourceUnfoldr
373− , benchIO "unfoldrM" DK.toNull DK.sourceUnfoldrM
353+ ]
354+#elif defined(O_N_SPACE)
355+ [ bgroup "streamD"
356+ [ bgroup "elimination"
357+ [ benchFold "toList" D.toList D.sourceUnfoldrM
374358 ]
375− , bgroup "elimination"
376− [ benchIO "toNull" DK.toNull DK.sourceUnfoldrM
377− , benchIO "uncons" DK.uncons DK.sourceUnfoldrM
359+ ]
360+ , bgroup "streamK"
361+ [ bgroup "elimination"
362+ [ benchFold "toList" K.toList K.sourceUnfoldrM
378363 ]
379364 ]
380− ]
365+ ]
366+#else
367+#error "One of O_1_SPACE/O_N_HEAP/O_N_STACK/O_N_SPACE must be defined"
368+#endif
benchmark/StreamDOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamD.hsrenamed+2−2
@@ -1,5 +1,5 @@
11-- |
2−-- Module : StreamDOps
2+-- Module : Streamly.Benchmark.Data.Stream.StreamD
33-- Copyright : (c) 2018 Harendra Kumar
44--
55-- License : BSD3
@@ -8,7 +8,7 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module StreamDOps where
11+module Streamly.Benchmark.Data.Stream.StreamD where
1212
1313import Control.Monad (when)
1414import Data.Maybe (isJust)
benchmark/StreamDKOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamDK.hsrenamed+2−2
@@ -1,5 +1,5 @@
11-- |
2−-- Module : StreamDKOps
2+-- Module : Streamly.Benchmark.Data.Stream.StreamDK
33-- Copyright : (c) 2018 Harendra Kumar
44--
55-- License : BSD3
@@ -8,7 +8,7 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module StreamDKOps where
11+module Streamly.Benchmark.Data.Stream.StreamDK where
1212
1313-- import Control.Monad (when)
1414-- import Data.Maybe (isJust)
benchmark/StreamKOps.hs → benchmark/Streamly/Benchmark/Data/Stream/StreamK.hsrenamed+2−2
@@ -1,5 +1,5 @@
11-- |
2−-- Module : StreamKOps
2+-- Module : Streamly.Benchmark.Data.Stream.StreamK
33-- Copyright : (c) 2018 Harendra Kumar
44--
55-- License : BSD3
@@ -8,7 +8,7 @@
88{-# LANGUAGE FlexibleContexts #-}
99{-# LANGUAGE ScopedTypeVariables #-}
1010
11−module StreamKOps where
11+module Streamly.Benchmark.Data.Stream.StreamK where
1212
1313import Control.Monad (when)
1414import Data.Maybe (isJust)
benchmark/streamly-benchmarks.cabal+48−12
@@ -156,49 +156,85 @@ common bench-options-threaded
156156 build-depends: streamly-benchmarks
157157 hs-source-dirs: .
158158
159+-- XXX the individual modules can just export a bunch of gauge Benchmark
160+-- grouped by space usage and then we can combine the groups in just four
161+-- different top level drivers.
162+
159163-------------------------------------------------------------------------------
160164-- Serial Streams
161165-------------------------------------------------------------------------------
162166
163167benchmark linear
164−-- benchmark serial-O-1-space
168+-- benchmark serial-o-1-space
165169 import: bench-options
166170 type: exitcode-stdio-1.0
167171 ghc-options: -with-rtsopts "-T -K36K -M16M"
168172 main-is: Streamly/Benchmark/Prelude/Serial/O_1_Space.hs
169173 other-modules: NestedOps, NestedUnfoldOps
170174
171−benchmark serial-O-n-heap
175+benchmark serial-o-n-heap
172176 import: bench-options
173177 type: exitcode-stdio-1.0
174178 ghc-options: -with-rtsopts "-T -K36K -M128M"
175179 main-is: Streamly/Benchmark/Prelude/Serial/O_n_Heap.hs
176180
177−benchmark serial-O-n-stack
181+benchmark serial-o-n-stack
178182 import: bench-options
179183 type: exitcode-stdio-1.0
180184 ghc-options: -with-rtsopts "-T -K1M -M16M"
181185 main-is: Streamly/Benchmark/Prelude/Serial/O_n_Stack.hs
182186
183−benchmark serial-O-n-space
187+benchmark serial-o-n-space
184188 import: bench-options
185189 type: exitcode-stdio-1.0
186190 ghc-options: -with-rtsopts "-T -K16M -M64M"
187191 main-is: Streamly/Benchmark/Prelude/Serial/O_n_Space.hs
188192 other-modules: NestedOps, NestedUnfoldOps
189193
194+-------------------------------------------------------------------------------
195+-- Raw Streams
196+-------------------------------------------------------------------------------
197+
198+library lib-base
199+ import: lib-options, bench-depends
200+ hs-source-dirs: ., lib
201+ exposed-modules:
202+ Streamly.Benchmark.Data.Stream.StreamD
203+ , Streamly.Benchmark.Data.Stream.StreamK
204+ , Streamly.Benchmark.Data.Stream.StreamDK
205+
190206benchmark base
207+-- benchmark base-o-1-space
191208 import: bench-options
192209 type: exitcode-stdio-1.0
193− if flag(dev)
194− cpp-options: -DDEVBUILD
195− ghc-options: -with-rtsopts "-T -K2M -M16M"
196− else
197− ghc-options: -with-rtsopts "-T -K128K -M16M"
210+ cpp-options: -DO_1_SPACE
211+ ghc-options: -with-rtsopts "-T -K36K -M16M"
212+ main-is: BaseStreams.hs
213+ build-depends: lib-base
214+
215+benchmark base-o-n-heap
216+ import: bench-options
217+ type: exitcode-stdio-1.0
218+ cpp-options: -DO_N_HEAP
219+ ghc-options: -with-rtsopts "-T -K36K -M64M"
220+ main-is: BaseStreams.hs
221+ build-depends: lib-base
222+
223+benchmark base-o-n-stack
224+ import: bench-options
225+ type: exitcode-stdio-1.0
226+ cpp-options: -DO_N_STACK
227+ ghc-options: -with-rtsopts "-T -K1M -M16M"
228+ main-is: BaseStreams.hs
229+ build-depends: lib-base
230+
231+benchmark base-o-n-space
232+ import: bench-options
233+ type: exitcode-stdio-1.0
234+ cpp-options: -DO_N_SPACE
235+ ghc-options: -with-rtsopts "-T -K2M -M32M"
198236 main-is: BaseStreams.hs
199− other-modules: StreamDOps
200− , StreamKOps
201− , StreamDKOps
237+ build-depends: lib-base
202238
203239executable nano-bench
204240 import: bench-options