@@ -5,80 +5,10 @@
55-- License : BSD3
66-- Maintainer : streamly@composewell.com
77
8−import Control.DeepSeq (NFData(..))
9−import Data.Functor.Identity (Identity, runIdentity)
10−import Data.Monoid (Last(..))
11−import System.Random (randomRIO)
12−
13−import qualified GHC.Exts as GHC
14−import qualified Streamly.Benchmark.Prelude as Ops
15−
16−import Streamly
17−import qualified Streamly.Data.Fold as FL
18−import qualified Streamly.Prelude as S
19−import qualified Streamly.Internal.Data.Sink as Sink
20−
21−import Streamly.Internal.Data.Time.Units
22−import qualified Streamly.Internal.Memory.Array as IA
23−import qualified Streamly.Internal.Data.Fold as IFL
24−import qualified Streamly.Internal.Prelude as IP
25−import qualified Streamly.Internal.Data.Pipe as Pipe
26−
27−import qualified NestedOps as Nested
28−import qualified NestedUnfoldOps as NestedUnfold
29−
30−import Gauge
318import Streamly.Benchmark.Common
9+import Streamly.Benchmark.Groups
3210
33−-------------------------------------------------------------------------------
34−--
35−-------------------------------------------------------------------------------
36−
37−-- We need a monadic bind here to make sure that the function f does not get
38−-- completely optimized out by the compiler in some cases.
39−
40−-- | Takes a fold method, and uses it with a default source.
41−{-# INLINE benchIOSink #-}
42−benchIOSink
43− :: (IsStream t, NFData b)
44− => Int -> String -> (t IO Int -> IO b) -> Benchmark
45−benchIOSink value name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source value
46−
47−{-# INLINE benchHoistSink #-}
48−benchHoistSink
49− :: (IsStream t, NFData b)
50− => Int -> String -> (t Identity Int -> IO b) -> Benchmark
51−benchHoistSink value name f =
52− bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.sourceUnfoldr value
53−
54−-- XXX We should be using sourceUnfoldrM for fair comparison with IO monad, but
55−-- we can't use it as it requires MonadAsync constraint.
56−{-# INLINE benchIdentitySink #-}
57−benchIdentitySink
58− :: (IsStream t, NFData b)
59− => Int -> String -> (t Identity Int -> Identity b) -> Benchmark
60−benchIdentitySink value name f = bench name $ nf (f . Ops.sourceUnfoldr value) 1
61−
62−-- | Takes a source, and uses it with a default drain/fold method.
63−{-# INLINE benchIOSrc #-}
64−benchIOSrc
65− :: (t IO a -> SerialT IO a)
66− -> String
67− -> (Int -> t IO a)
68− -> Benchmark
69−benchIOSrc t name f =
70− bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
71−
72−{-# INLINE benchPureSink #-}
73−benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
74−benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
75−
76−benchIO :: (NFData b) => String -> (Int -> IO b) -> Benchmark
77−benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f
78−
79−-------------------------------------------------------------------------------
80−--
81−-------------------------------------------------------------------------------
11+import Gauge
8212
8313-- In addition to gauge options, the number of elements in the stream can be
8414-- passed using the --stream-size option.
@@ -86,388 +16,42 @@ benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f
8616main :: IO ()
8717main = do
8818 (value, cfg, benches) <- parseCLIOpts defaultStreamSize
89− value `seq` runMode (mode cfg) cfg benches
90− [ bgroup "serially"
91− [ bgroup "pure"
92− [ benchPureSink value "id" id
93− , benchPureSink1 "eqBy" (Ops.eqByPure value)
94− , benchPureSink value "==" Ops.eqInstance
95− , benchPureSink value "/=" Ops.eqInstanceNotEq
96− , benchPureSink1 "cmpBy" (Ops.cmpByPure value)
97− , benchPureSink value "<" Ops.ordInstance
98− , benchPureSink value "min" Ops.ordInstanceMin
99− , benchPureSrc "IsList.fromList" (Ops.sourceIsList value)
100− -- length is used to check for foldr/build fusion
101− , benchPureSink value "length . IsList.toList" (length . GHC.toList)
102− , benchPureSrc "IsString.fromString" (Ops.sourceIsString value)
103− , benchPureSink value "showsPrec pure streams" Ops.showInstance
104− , benchPureSink value "foldl'" Ops.pureFoldl'
105− ]
106− , bgroup "foldable"
107− [ -- Foldable instance
108− -- type class operations
109− bench "foldl'" $ nf (Ops.foldableFoldl' value) 1
110− , bench "foldrElem" $ nf (Ops.foldableFoldrElem value) 1
111− -- , bench "null" $ nf (Ops.foldableNull value) 1
112− , bench "elem" $ nf (Ops.foldableElem value) 1
113− , bench "length" $ nf (Ops.foldableLength value) 1
114− , bench "sum" $ nf (Ops.foldableSum value) 1
115− , bench "product" $ nf (Ops.foldableProduct value) 1
116− , bench "minimum" $ nf (Ops.foldableMin value) 1
117− , bench "maximum" $ nf (Ops.foldableMax value) 1
118− , bench "length . toList" $
119− nf (length . Ops.foldableToList value) 1
120−
121− -- folds
122− , bench "notElem" $ nf (Ops.foldableNotElem value) 1
123− , bench "find" $ nf (Ops.foldableFind value) 1
124− , bench "all" $ nf (Ops.foldableAll value) 1
125− , bench "any" $ nf (Ops.foldableAny value) 1
126− , bench "and" $ nf (Ops.foldableAnd value) 1
127− , bench "or" $ nf (Ops.foldableOr value) 1
128−
129− -- Note: minimumBy/maximumBy do not work in constant memory they are in
130− -- the O(n) group of benchmarks down below in this file.
131−
132− -- Applicative and Traversable operations
133− -- TBD: traverse_
134− , benchIOSink1 "mapM_" (Ops.foldableMapM_ value)
135− -- TBD: for_
136− -- TBD: forM_
137− , benchIOSink1 "sequence_" (Ops.foldableSequence_ value)
138− -- TBD: sequenceA_
139− -- TBD: asum
140− -- , benchIOSink1 "msum" (Ops.foldableMsum value)
141− ]
142− , bgroup "generation"
143− [ -- Most basic, barely stream continuations running
144− benchIOSrc serially "unfoldr" (Ops.sourceUnfoldr value)
145− , benchIOSrc serially "unfoldrM" (Ops.sourceUnfoldrM value)
146− , benchIOSrc serially "intFromTo" (Ops.sourceIntFromTo value)
147− , benchIOSrc serially "intFromThenTo" (Ops.sourceIntFromThenTo value)
148− , benchIOSrc serially "integerFromStep" (Ops.sourceIntegerFromStep value)
149− , benchIOSrc serially "fracFromThenTo" (Ops.sourceFracFromThenTo value)
150− , benchIOSrc serially "fracFromTo" (Ops.sourceFracFromTo value)
151− , benchIOSrc serially "fromList" (Ops.sourceFromList value)
152− , benchIOSrc serially "fromListM" (Ops.sourceFromListM value)
153− -- These are essentially cons and consM
154− , benchIOSrc serially "fromFoldable" (Ops.sourceFromFoldable value)
155− , benchIOSrc serially "fromFoldableM" (Ops.sourceFromFoldableM value)
156− , benchIOSrc serially "currentTime/0.00001s"
157− $ Ops.currentTime value 0.00001
158− ]
159− , bgroup "elimination"
160− [ bgroup "reduce"
161− [ bgroup "IO"
162− [
163− benchIOSink value "foldl'" Ops.foldl'Reduce
164− , benchIOSink value "foldl1'" Ops.foldl1'Reduce
165− , benchIOSink value "foldlM'" Ops.foldlM'Reduce
166− ]
167− , bgroup "Identity"
168− [
169− benchIdentitySink value "foldl'" Ops.foldl'Reduce
170− , benchIdentitySink value "foldl1'" Ops.foldl1'Reduce
171− , benchIdentitySink value "foldlM'" Ops.foldlM'Reduce
172− ]
173− ]
174−
175− , bgroup "build"
176− [ bgroup "IO"
177− [ benchIOSink value "foldrMElem" (Ops.foldrMElem value)
178− ]
179− , bgroup "Identity"
180− [ benchIdentitySink value "foldrMElem" (Ops.foldrMElem value)
181− , benchIdentitySink value "foldrMToStreamLength"
182− (S.length . runIdentity . Ops.foldrMToStream)
183− , benchPureSink value "foldrMToListLength"
184− (length . runIdentity . Ops.foldrMBuild)
185− ]
186− ]
187− , benchIOSink value "uncons" Ops.uncons
188− , benchIOSink value "toNull" $ Ops.toNull serially
189− , benchIOSink value "mapM_" Ops.mapM_
190−
191− , benchIOSink value "init" Ops.init
192−
193− -- this is too low and causes all benchmarks reported in ns
194− -- , benchIOSink value "head" Ops.head
195− , benchIOSink value "last" Ops.last
196− -- , benchIOSink value "lookup" Ops.lookup
197− , benchIOSink value "find" (Ops.find value)
198− , benchIOSink value "findIndex" (Ops.findIndex value)
199− , benchIOSink value "elemIndex" (Ops.elemIndex value)
200−
201− -- this is too low and causes all benchmarks reported in ns
202− -- , benchIOSink value "null" Ops.null
203− , benchIOSink value "elem" (Ops.elem value)
204− , benchIOSink value "notElem" (Ops.notElem value)
205− , benchIOSink value "all" (Ops.all value)
206− , benchIOSink value "any" (Ops.any value)
207− , benchIOSink value "and" (Ops.and value)
208− , benchIOSink value "or" (Ops.or value)
209−
210− , benchIOSink value "length" Ops.length
211− , benchHoistSink value "length . generally" (Ops.length . IP.generally)
212− , benchIOSink value "sum" Ops.sum
213− , benchIOSink value "product" Ops.product
214−
215− , benchIOSink value "maximumBy" Ops.maximumBy
216− , benchIOSink value "maximum" Ops.maximum
217− , benchIOSink value "minimumBy" Ops.minimumBy
218− , benchIOSink value "minimum" Ops.minimum
219−
220− ]
221− , bgroup "folds"
222− [ benchIOSink value "drain" (S.fold FL.drain)
223− , benchIOSink value "drainN" (S.fold (IFL.drainN value))
224− , benchIOSink value "drainWhileTrue" (S.fold (IFL.drainWhile $ (<=) (value + 1)))
225− , benchIOSink value "drainWhileFalse" (S.fold (IFL.drainWhile $ (>=) (value + 1)))
226− , benchIOSink value "sink" (S.fold $ Sink.toFold Sink.drain)
227− , benchIOSink value "last" (S.fold FL.last)
228− , benchIOSink value "lastN.1" (S.fold (IA.lastN 1))
229− , benchIOSink value "lastN.10" (S.fold (IA.lastN 10))
230− , benchIOSink value "length" (S.fold FL.length)
231− , benchIOSink value "sum" (S.fold FL.sum)
232− , benchIOSink value "product" (S.fold FL.product)
233− , benchIOSink value "maximumBy" (S.fold (FL.maximumBy compare))
234− , benchIOSink value "maximum" (S.fold FL.maximum)
235− , benchIOSink value "minimumBy" (S.fold (FL.minimumBy compare))
236− , benchIOSink value "minimum" (S.fold FL.minimum)
237− , benchIOSink value "mean" (\s -> S.fold FL.mean (S.map (fromIntegral :: Int -> Double) s))
238− , benchIOSink value "variance" (\s -> S.fold FL.variance (S.map (fromIntegral :: Int -> Double) s))
239− , benchIOSink value "stdDev" (\s -> S.fold FL.stdDev (S.map (fromIntegral :: Int -> Double) s))
240−
241− , benchIOSink value "mconcat" (S.fold FL.mconcat . (S.map (Last . Just)))
242− , benchIOSink value "foldMap" (S.fold (FL.foldMap (Last . Just)))
243−
244− , benchIOSink value "index" (S.fold (FL.index (value + 1)))
245− , benchIOSink value "head" (S.fold FL.head)
246− , benchIOSink value "find" (S.fold (FL.find (== (value + 1))))
247− , benchIOSink value "findIndex" (S.fold (FL.findIndex (== (value + 1))))
248− , benchIOSink value "elemIndex" (S.fold (FL.elemIndex (value + 1)))
249−
250− , benchIOSink value "null" (S.fold FL.null)
251− , benchIOSink value "elem" (S.fold (FL.elem (value + 1)))
252− , benchIOSink value "notElem" (S.fold (FL.notElem (value + 1)))
253− , benchIOSink value "all" (S.fold (FL.all (<= (value + 1))))
254− , benchIOSink value "any" (S.fold (FL.any (> (value + 1))))
255− , benchIOSink value "and" (\s -> S.fold FL.and (S.map (<= (value + 1)) s))
256− , benchIOSink value "or" (\s -> S.fold FL.or (S.map (> (value + 1)) s))
257− ]
258− , bgroup "fold-multi-stream"
259− [ benchIOSink1 "eqBy" (Ops.eqBy value)
260− , benchIOSink1 "cmpBy" (Ops.cmpBy value)
261− , benchIOSink value "isPrefixOf" Ops.isPrefixOf
262− , benchIOSink value "isSubsequenceOf" Ops.isSubsequenceOf
263− , benchIOSink value "stripPrefix" Ops.stripPrefix
264− ]
265− , bgroup "folds-transforms"
266− [ benchIOSink value "drain" (S.fold FL.drain)
267− , benchIOSink value "lmap" (S.fold (IFL.lmap (+1) FL.drain))
268− , benchIOSink value "pipe-mapM"
269− (S.fold (IFL.transform (Pipe.mapM (\x -> return $ x + 1)) FL.drain))
270− ]
271− , bgroup "folds-compositions" -- Applicative
272− [
273− benchIOSink value "all,any" (S.fold ((,) <$> FL.all (<= (value + 1))
274− <*> FL.any (> (value + 1))))
275− , benchIOSink value "sum,length" (S.fold ((,) <$> FL.sum <*> FL.length))
276− ]
277− , bgroup "pipes"
278− [ benchIOSink value "mapM" (Ops.transformMapM serially 1)
279− , benchIOSink value "compose" (Ops.transformComposeMapM serially 1)
280− , benchIOSink value "tee" (Ops.transformTeeMapM serially 1)
281− , benchIOSink value "zip" (Ops.transformZipMapM serially 1)
282− ]
283− , bgroup "pipesX4"
284− [ benchIOSink value "mapM" (Ops.transformMapM serially 4)
285− , benchIOSink value "compose" (Ops.transformComposeMapM serially 4)
286− , benchIOSink value "tee" (Ops.transformTeeMapM serially 4)
287− , benchIOSink value "zip" (Ops.transformZipMapM serially 4)
288− ]
289− , bgroup "transformer"
290− [ benchIOSrc serially "evalState" (Ops.evalStateT value)
291− , benchIOSrc serially "withState" (Ops.withState value)
292− ]
293− , bgroup "transformation"
294− [ benchIOSink value "scanl" (Ops.scan 1)
295− , benchIOSink value "scanl1'" (Ops.scanl1' 1)
296− , benchIOSink value "map" (Ops.map 1)
297− , benchIOSink value "fmap" (Ops.fmap 1)
298− , benchIOSink value "mapM" (Ops.mapM serially 1)
299− , benchIOSink value "mapMaybe" (Ops.mapMaybe 1)
300− , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 1)
301− , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
302− Ops.sequence serially (Ops.sourceUnfoldrMAction value n)
303− , benchIOSink value "findIndices" (Ops.findIndices value 1)
304− , benchIOSink value "elemIndices" (Ops.elemIndices value 1)
305− , benchIOSink value "foldrS" (Ops.foldrS 1)
306− , benchIOSink value "foldrSMap" (Ops.foldrSMap 1)
307− , benchIOSink value "foldrT" (Ops.foldrT 1)
308− , benchIOSink value "foldrTMap" (Ops.foldrTMap 1)
309− , benchIOSink value "tap" (Ops.tap 1)
310− , benchIOSink value "tapRate 1 second" (Ops.tapRate 1)
311− , benchIOSink value "pollCounts 1 second" (Ops.pollCounts 1)
312− , benchIOSink value "tapAsync" (Ops.tapAsync 1)
313− , benchIOSink value "tapAsyncS" (Ops.tapAsyncS 1)
314− ]
315− , bgroup "transformationX4"
316− [ benchIOSink value "scan" (Ops.scan 4)
317− , benchIOSink value "scanl1'" (Ops.scanl1' 4)
318− , benchIOSink value "map" (Ops.map 4)
319− , benchIOSink value "fmap" (Ops.fmap 4)
320− , benchIOSink value "mapM" (Ops.mapM serially 4)
321− , benchIOSink value "mapMaybe" (Ops.mapMaybe 4)
322− , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 4)
323− -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
324− -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
325− , benchIOSink value "findIndices" (Ops.findIndices value 4)
326− , benchIOSink value "elemIndices" (Ops.elemIndices value 4)
327− ]
328− , bgroup "filtering"
329− [ benchIOSink value "filter-even" (Ops.filterEven 1)
330− , benchIOSink value "filter-all-out" (Ops.filterAllOut value 1)
331− , benchIOSink value "filter-all-in" (Ops.filterAllIn value 1)
332−
333− , benchIOSink value "take-all" (Ops.takeAll value 1)
334− , benchIOSink value "takeByTime-all"
335− (Ops.takeByTime (NanoSecond64 maxBound) 1)
336− , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 1)
337− --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 1)
338−
339− -- "drop-one" is dual to "last"
340− , benchIOSink value "drop-one" (Ops.dropOne 1)
341− , benchIOSink value "drop-all" (Ops.dropAll value 1)
342− , benchIOSink value "dropByTime-all"
343− (Ops.dropByTime (NanoSecond64 maxBound) 1)
344− , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 1)
345− --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 1)
346− , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 1)
347−
348− , benchIOSink value "deleteBy" (Ops.deleteBy value 1)
349− , benchIOSink value "intersperse" (Ops.intersperse value 1)
350− , benchIOSink value "insertBy" (Ops.insertBy value 1)
351− ]
352− , bgroup "filteringX4"
353− [ benchIOSink value "filter-even" (Ops.filterEven 4)
354− , benchIOSink value "filter-all-out" (Ops.filterAllOut value 4)
355− , benchIOSink value "filter-all-in" (Ops.filterAllIn value 4)
356− , benchIOSink value "take-all" (Ops.takeAll value 4)
357− , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 4)
358− --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 4)
359− , benchIOSink value "drop-one" (Ops.dropOne 4)
360− , benchIOSink value "drop-all" (Ops.dropAll value 4)
361− , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 4)
362− --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 4)
363− , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 4)
364− , benchIOSink value "deleteBy" (Ops.deleteBy value 4)
365− , benchIOSink value "intersperse" (Ops.intersperse value 4)
366− , benchIOSink value "insertBy" (Ops.insertBy value 4)
367− ]
368− , bgroup "joining"
369− [ benchIOSrc1 "zip (2,x/2)" (Ops.zip (value `div` 2))
370− , benchIOSrc1 "zipM (2,x/2)" (Ops.zipM (value `div` 2))
371− , benchIOSrc1 "mergeBy (2,x/2)" (Ops.mergeBy (value `div` 2))
372− , benchIOSrc1 "serial (2,x/2)" (Ops.serial2 (value `div` 2))
373− , benchIOSrc1 "append (2,x/2)" (Ops.append2 (value `div` 2))
374− , benchIOSrc1 "serial (2,2,x/4)" (Ops.serial4 (value `div` 4))
375− , benchIOSrc1 "append (2,2,x/4)" (Ops.append4 (value `div` 4))
376− , benchIOSrc1 "wSerial (2,x/2)" (Ops.wSerial2 value)
377− , benchIOSrc1 "interleave (2,x/2)" (Ops.interleave2 value)
378− , benchIOSrc1 "roundRobin (2,x/2)" (Ops.roundRobin2 value)
379− ]
380− , bgroup "concat-foldable"
381− [ benchIOSrc serially "foldMapWith" (Ops.sourceFoldMapWith value)
382− , benchIOSrc serially "foldMapWithM" (Ops.sourceFoldMapWithM value)
383− , benchIOSrc serially "foldMapM" (Ops.sourceFoldMapM value)
384− , benchIOSrc serially "foldWithConcatMapId" (Ops.sourceConcatMapId value)
385− ]
386− , bgroup "concat-serial"
387− [ benchIOSrc1 "concatMapPure (2,x/2)" (Ops.concatMapPure 2 (value `div` 2))
388− , benchIOSrc1 "concatMap (2,x/2)" (Ops.concatMap 2 (value `div` 2))
389− , benchIOSrc1 "concatMap (x/2,2)" (Ops.concatMap (value `div` 2) 2)
390− , benchIOSrc1 "concatMapRepl (x/4,4)" (Ops.concatMapRepl4xN value)
391− , benchIOSrc1 "concatUnfoldRepl (x/4,4)" (Ops.concatUnfoldRepl4xN value)
392−
393− , benchIOSrc1 "concatMapWithSerial (2,x/2)"
394− (Ops.concatMapWithSerial 2 (value `div` 2))
395− , benchIOSrc1 "concatMapWithSerial (x/2,2)"
396− (Ops.concatMapWithSerial (value `div` 2) 2)
397−
398− , benchIOSrc1 "concatMapWithAppend (2,x/2)"
399− (Ops.concatMapWithAppend 2 (value `div` 2))
400− ]
401− , bgroup "outer-product-streams"
402− [ benchIO "toNullAp" $ Nested.toNullAp value serially
403− , benchIO "toNull" $ Nested.toNull value serially
404− , benchIO "toNull3" $ Nested.toNull3 value serially
405− , benchIO "filterAllOut" $ Nested.filterAllOut value serially
406− , benchIO "filterAllIn" $ Nested.filterAllIn value serially
407− , benchIO "filterSome" $ Nested.filterSome value serially
408− , benchIO "breakAfterSome" $ Nested.breakAfterSome value serially
409− ]
410− , bgroup "outer-product-unfolds"
411− [ benchIO "toNull" $ NestedUnfold.toNull value
412− , benchIO "toNull3" $ NestedUnfold.toNull3 value
413− , benchIO "concat" $ NestedUnfold.concat value
414− , benchIO "filterAllOut" $ NestedUnfold.filterAllOut value
415− , benchIO "filterAllIn" $ NestedUnfold.filterAllIn value
416− , benchIO "filterSome" $ NestedUnfold.filterSome value
417− , benchIO "breakAfterSome" $ NestedUnfold.breakAfterSome value
418− ]
419− -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
420− -- library. If scan/fold followed by a map is efficient enough we may not
421− -- need monolithic implementations of these.
422− , bgroup "mixed"
423− [ benchIOSink value "scanl-map" (Ops.scanMap 1)
424− , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
425− , benchIOSink value "sum-product-fold" Ops.sumProductFold
426− , benchIOSink value "sum-product-scan" Ops.sumProductScan
427− ]
428− , bgroup "mixedX4"
429− [ benchIOSink value "scan-map" (Ops.scanMap 4)
430− , benchIOSink value "drop-map" (Ops.dropMap 4)
431− , benchIOSink value "drop-scan" (Ops.dropScan 4)
432− , benchIOSink value "take-drop" (Ops.takeDrop value 4)
433− , benchIOSink value "take-scan" (Ops.takeScan value 4)
434− , benchIOSink value "take-map" (Ops.takeMap value 4)
435− , benchIOSink value "filter-drop" (Ops.filterDrop value 4)
436− , benchIOSink value "filter-take" (Ops.filterTake value 4)
437− , benchIOSink value "filter-scan" (Ops.filterScan 4)
438− , benchIOSink value "filter-scanl1" (Ops.filterScanl1 4)
439− , benchIOSink value "filter-map" (Ops.filterMap value 4)
440− ]
441− ]
442− , bgroup "wSerially"
443− [ bgroup "transformation"
444− [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
445− ]
446− , bgroup "concatMap"
447− [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
448− (Ops.concatMapWithWSerial 2 (value `div` 2))
449− , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
450− (Ops.concatMapWithWSerial (value `div` 2) 2)
451− ]
452− , bgroup "outer-product"
453− [ benchIO "toNullAp" $ Nested.toNullAp value wSerially
454− , benchIO "toNull" $ Nested.toNull value wSerially
455− , benchIO "toNull3" $ Nested.toNull3 value wSerially
456− , benchIO "filterAllOut" $ Nested.filterAllOut value wSerially
457− , benchIO "filterAllIn" $ Nested.filterAllIn value wSerially
458− , benchIO "filterSome" $ Nested.filterSome value wSerially
459− , benchIO "breakAfterSome" $ Nested.breakAfterSome value wSerially
460− ]
461− ]
462− , bgroup "zipSerially"
463− [ bgroup "transformation"
464− [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
465− ]
466− -- XXX needs fixing
467− {-
468− , bgroup "outer-product"
469− [ benchIO "toNullAp" $ Nested.toNullAp value zipSerially
470− ]
471− -}
472− ]
473− ]
19+ value `seq`
20+ runMode
21+ (mode cfg)
22+ cfg
23+ benches
24+ (concat [serial value, wSerial value, zipSerial value])
25+ where
26+ serial value =
27+ concat
28+ [ o_1_space_serial_pure value
29+ , o_1_space_serial_foldable value
30+ , o_1_space_serial_generation value
31+ , o_1_space_serial_elimination value
32+ , o_1_space_serial_folds value
33+ , o_1_space_serial_foldMultiStream value
34+ , o_1_space_serial_foldsTransforms value
35+ , o_1_space_serial_foldsCompositions value
36+ , o_1_space_serial_pipes value
37+ , o_1_space_serial_pipesX4 value
38+ , o_1_space_serial_transformer value
39+ , o_1_space_serial_transformation value
40+ , o_1_space_serial_transformationX4 value
41+ , o_1_space_serial_filtering value
42+ , o_1_space_serial_filteringX4 value
43+ , o_1_space_serial_joining value
44+ , o_1_space_serial_concatFoldable value
45+ , o_1_space_serial_concatSerial value
46+ , o_1_space_serial_outerProductStreams value
47+ , o_1_space_serial_outerProductUnfolds value
48+ , o_1_space_serial_mixed value
49+ , o_1_space_serial_mixedX4 value
50+ ]
51+ wSerial value =
52+ concat
53+ [ o_1_space_wSerial_transformation value
54+ , o_1_space_wSerial_concatMap value
55+ , o_1_space_wSerial_outerProduct value
56+ ]
57+ zipSerial value = concat [o_1_space_zipSerial_transformation value]