@@ -1,5 +1,5 @@
2−-- Module : Serial.NestedFold
2+-- Module : Stream.Reduce
3-- Copyright : (c) 2018 Composewell Technologies
3-- Copyright : (c) 2018 Composewell Technologies
4-- License : BSD-3-Clause
4-- License : BSD-3-Clause
5-- Maintainer : streamly@composewell.com
5-- Maintainer : streamly@composewell.com
@@ -11,26 +11,37 @@
11{-# LANGUAGE DeriveGeneric #-}
11{-# LANGUAGE DeriveGeneric #-}
12{-# LANGUAGE RankNTypes #-}
12{-# LANGUAGE RankNTypes #-}
14−module Serial.NestedFold (benchmarks) where
14+module Stream.Reduce (benchmarks) where
16import Control.DeepSeq (NFData(..))
16import Control.DeepSeq (NFData(..))
17−import Control.Monad (when)
18import Control.Monad.IO.Class (MonadIO(..))
17import Control.Monad.IO.Class (MonadIO(..))
19import Data.Monoid (Sum(..))
18import Data.Monoid (Sum(..))
20−import Data.Proxy (Proxy(..))
21−import Data.HashMap.Strict (HashMap)
22import GHC.Generics (Generic)
19import GHC.Generics (Generic)
23import Streamly.Internal.Data.IsMap.HashMap ()
20import Streamly.Internal.Data.IsMap.HashMap ()
21+import Streamly.Internal.Data.Stream.Serial (SerialT)
25import qualified Streamly.Internal.Data.Refold.Type as Refold
23import qualified Streamly.Internal.Data.Refold.Type as Refold
26import qualified Streamly.Internal.Data.Fold as FL
24import qualified Streamly.Internal.Data.Fold as FL
25+import qualified Stream.Common as Common
27+import Control.Monad (when)
28+import Data.Proxy (Proxy(..))
29+import Data.HashMap.Strict (HashMap)
27−import qualified Streamly.Internal.Data.Stream.IsStream as Internal
30+import qualified Streamly.Internal.Data.Stream.IsStream as S
31+import Streamly.Prelude (fromSerial)
32+import Streamly.Benchmark.Prelude hiding
33+ ( benchIOSrc, sourceUnfoldrM, apDiscardFst, apDiscardSnd, apLiftA2
34+ , toNullAp, monadThen, toNullM, toNullM3, filterAllInM, filterAllOutM
35+ , filterSome, breakAfterSome, toListM, toListSome, transformMapM
36+ , transformComposeMapM, transformTeeMapM, transformZipMapM)
38+import Streamly.Benchmark.Prelude (benchIO)
28−import qualified Streamly.Prelude as S
39+import qualified Streamly.Internal.Data.Stream as S
30import Gauge
42import Gauge
31−import Streamly.Prelude (SerialT, fromSerial)
32import Streamly.Benchmark.Common
43import Streamly.Benchmark.Common
33−import Streamly.Benchmark.Prelude
44+import Stream.Common
34import Prelude hiding (reverse, tail)
45import Prelude hiding (reverse, tail)
36-------------------------------------------------------------------------------
47-------------------------------------------------------------------------------
@@ -48,13 +59,14 @@ iterateN g initial count = f count initial
49-- Iterate a transformation over a singleton stream
60-- Iterate a transformation over a singleton stream
50{-# INLINE iterateSingleton #-}
61{-# INLINE iterateSingleton #-}
51−iterateSingleton :: S.MonadAsync m
62+iterateSingleton :: Monad m
52 => (Int -> SerialT m Int -> SerialT m Int)
63 => (Int -> SerialT m Int -> SerialT m Int)
55 -> SerialT m Int
66 -> SerialT m Int
56iterateSingleton g count n = iterateN g (return n) count
67iterateSingleton g count n = iterateN g (return n) count
58-- XXX need to check why this is slower than the explicit recursion above, even
70-- XXX need to check why this is slower than the explicit recursion above, even
59-- if the above code is written in a foldr like head recursive way. We also
71-- if the above code is written in a foldr like head recursive way. We also
60-- need to try this with foldlM' once #150 is fixed.
72-- need to try this with foldlM' once #150 is fixed.
@@ -62,17 +74,18 @@ iterateSingleton g count n = iterateN g (return n) count
62-- foldrM and any related fusion issues.
74-- foldrM and any related fusion issues.
63{-# INLINE _iterateSingleton #-}
75{-# INLINE _iterateSingleton #-}
64_iterateSingleton ::
76_iterateSingleton ::
65− S.MonadAsync m
77+ Monad m
66 => (Int -> SerialT m Int -> SerialT m Int)
78 => (Int -> SerialT m Int -> SerialT m Int)
69 -> SerialT m Int
81 -> SerialT m Int
70_iterateSingleton g value n = S.foldrM g (return n) $ sourceIntFromTo value n
82_iterateSingleton g value n = S.foldrM g (return n) $ sourceIntFromTo value n
72-- Apply transformation g count times on a stream of length len
85-- Apply transformation g count times on a stream of length len
73{-# INLINE iterateSource #-}
86{-# INLINE iterateSource #-}
74iterateSource ::
87iterateSource ::
75− S.MonadAsync m
88+ MonadAsync m
76 => (SerialT m Int -> SerialT m Int)
89 => (SerialT m Int -> SerialT m Int)
@@ -94,9 +107,9 @@ o_n_space_functor value =
94 [ bgroup "Functor"
107 [ bgroup "Functor"
95 [ benchIO "(+) (n times) (baseline)" $ \i0 ->
108 [ benchIO "(+) (n times) (baseline)" $ \i0 ->
96 iterateN (\i acc -> acc >>= \n -> return $ i + n) (return i0) value
109 iterateN (\i acc -> acc >>= \n -> return $ i + n) (return i0) value
97− , benchIOSrc fromSerial "(<$) (n times)" $
110+ , benchIOSrc "(<$) (n times)" $
98 iterateSingleton (<$) value
111 iterateSingleton (<$) value
99− , benchIOSrc fromSerial "fmap (n times)" $
112+ , benchIOSrc "fmap (n times)" $
100 iterateSingleton (fmap . (+)) value
113 iterateSingleton (fmap . (+)) value
102 , benchIOSrc fromSerial "_(<$) (n times)" $
115 , benchIOSrc fromSerial "_(<$) (n times)" $
@@ -111,74 +124,92 @@ o_n_space_functor value =
111-- Grouping transformations
124-- Grouping transformations
112-------------------------------------------------------------------------------
125-------------------------------------------------------------------------------
114{-# INLINE groups #-}
128{-# INLINE groups #-}
115groups :: MonadIO m => SerialT m Int -> m ()
129groups :: MonadIO m => SerialT m Int -> m ()
116−groups = S.drain . S.groups FL.drain
130+groups = Common.drain . S.groups FL.drain
118-- XXX Change this test when the order of comparison is later changed
132-- XXX Change this test when the order of comparison is later changed
119{-# INLINE groupsByGT #-}
133{-# INLINE groupsByGT #-}
120groupsByGT :: MonadIO m => SerialT m Int -> m ()
134groupsByGT :: MonadIO m => SerialT m Int -> m ()
121−groupsByGT = S.drain . S.groupsBy (>) FL.drain
135+groupsByGT = Common.drain . S.groupsBy (>) FL.drain
123{-# INLINE groupsByEq #-}
137{-# INLINE groupsByEq #-}
124groupsByEq :: MonadIO m => SerialT m Int -> m ()
138groupsByEq :: MonadIO m => SerialT m Int -> m ()
125−groupsByEq = S.drain . S.groupsBy (==) FL.drain
139+groupsByEq = Common.drain . S.groupsBy (==) FL.drain
127-- XXX Change this test when the order of comparison is later changed
141-- XXX Change this test when the order of comparison is later changed
128{-# INLINE groupsByRollingLT #-}
142{-# INLINE groupsByRollingLT #-}
129groupsByRollingLT :: MonadIO m => SerialT m Int -> m ()
143groupsByRollingLT :: MonadIO m => SerialT m Int -> m ()
130groupsByRollingLT =
144groupsByRollingLT =
131− S.drain . S.groupsByRolling (<) FL.drain
145+ Common.drain . S.groupsByRolling (<) FL.drain
133{-# INLINE groupsByRollingEq #-}
147{-# INLINE groupsByRollingEq #-}
134groupsByRollingEq :: MonadIO m => SerialT m Int -> m ()
148groupsByRollingEq :: MonadIO m => SerialT m Int -> m ()
135groupsByRollingEq =
149groupsByRollingEq =
136− S.drain . S.groupsByRolling (==) FL.drain
150+ Common.drain . S.groupsByRolling (==) FL.drain
138{-# INLINE foldMany #-}
153{-# INLINE foldMany #-}
139foldMany :: Monad m => SerialT m Int -> m ()
154foldMany :: Monad m => SerialT m Int -> m ()
140foldMany =
155foldMany =
141− S.drain
156+ Common.drain
142− . S.map getSum
157+ . fmap getSum
143− . Internal.foldMany (FL.take 2 FL.mconcat)
158+ . S.foldMany (FL.take 2 FL.mconcat)
161+{-# INLINE foldManyPost #-}
162+foldManyPost :: Monad m => SerialT m Int -> m ()
166+ . S.foldManyPost (FL.take 2 FL.mconcat)
144− . S.map Sum
167+ . fmap Sum
146{-# INLINE refoldMany #-}
169{-# INLINE refoldMany #-}
147refoldMany :: Monad m => SerialT m Int -> m ()
170refoldMany :: Monad m => SerialT m Int -> m ()
148refoldMany =
171refoldMany =
149− S.drain
172+ Common.drain
150− . S.map getSum
173+ . fmap getSum
151− . Internal.refoldMany (Refold.take 2 Refold.sconcat) (return mempty)
174+ . S.refoldMany (Refold.take 2 Refold.sconcat) (return mempty)
152− . S.map Sum
175+ . fmap Sum
154{-# INLINE foldIterateM #-}
177{-# INLINE foldIterateM #-}
155foldIterateM :: Monad m => SerialT m Int -> m ()
178foldIterateM :: Monad m => SerialT m Int -> m ()
156foldIterateM =
179foldIterateM =
157− S.drain
180+ Common.drain
158− . S.map getSum
181+ . fmap getSum
159− . Internal.foldIterateM
182+ . S.foldIterateM
160 (return . FL.take 2 . FL.sconcat) (return (Sum 0))
183 (return . FL.take 2 . FL.sconcat) (return (Sum 0))
161− . S.map Sum
184+ . fmap Sum
163{-# INLINE refoldIterateM #-}
186{-# INLINE refoldIterateM #-}
164refoldIterateM :: Monad m => SerialT m Int -> m ()
187refoldIterateM :: Monad m => SerialT m Int -> m ()
165refoldIterateM =
188refoldIterateM =
166− S.drain
189+ Common.drain
167− . S.map getSum
190+ . fmap getSum
168− . Internal.refoldIterateM
191+ . S.refoldIterateM
169 (Refold.take 2 Refold.sconcat) (return (Sum 0))
192 (Refold.take 2 Refold.sconcat) (return (Sum 0))
170− . S.map Sum
193+ . fmap Sum
172o_1_space_grouping :: Int -> [Benchmark]
195o_1_space_grouping :: Int -> [Benchmark]
173o_1_space_grouping value =
196o_1_space_grouping value =
174 -- Buffering operations using heap proportional to group/window sizes.
197 -- Buffering operations using heap proportional to group/window sizes.
175 [ bgroup "grouping"
198 [ bgroup "grouping"
176− [ benchIOSink value "groups" groups
201+ benchIOSink value "groups" groups
177 , benchIOSink value "groupsByGT" groupsByGT
202 , benchIOSink value "groupsByGT" groupsByGT
178 , benchIOSink value "groupsByEq" groupsByEq
203 , benchIOSink value "groupsByEq" groupsByEq
179 , benchIOSink value "groupsByRollingLT" groupsByRollingLT
204 , benchIOSink value "groupsByRollingLT" groupsByRollingLT
180 , benchIOSink value "groupsByRollingEq" groupsByRollingEq
205 , benchIOSink value "groupsByRollingEq" groupsByRollingEq
208+ -- XXX parseMany/parseIterate benchmarks are in the Parser/ParserD
209+ -- modules we can bring those here. arraysOf benchmarks are in
210+ -- Parser/ParserD/Array.Stream/FileSystem.Handle.
181− , benchIOSink value "foldMany" foldMany
211+ benchIOSink value "foldMany" foldMany
212+ , benchIOSink value "foldManyPost" foldManyPost
182 , benchIOSink value "refoldMany" refoldMany
213 , benchIOSink value "refoldMany" refoldMany
183 , benchIOSink value "foldIterateM" foldIterateM
214 , benchIOSink value "foldIterateM" foldIterateM
184 , benchIOSink value "refoldIterateM" refoldIterateM
215 , benchIOSink value "refoldIterateM" refoldIterateM
@@ -195,7 +226,7 @@ reverse n = composeN n S.reverse
196{-# INLINE reverse' #-}
227{-# INLINE reverse' #-}
197reverse' :: MonadIO m => Int -> SerialT m Int -> m ()
228reverse' :: MonadIO m => Int -> SerialT m Int -> m ()
198−reverse' n = composeN n Internal.reverse'
229+reverse' n = composeN n S.reverse'
200o_n_heap_buffering :: Int -> [Benchmark]
231o_n_heap_buffering :: Int -> [Benchmark]
201o_n_heap_buffering value =
232o_n_heap_buffering value =
@@ -205,7 +236,9 @@ o_n_heap_buffering value =
205 benchIOSink value "reverse" (reverse 1)
236 benchIOSink value "reverse" (reverse 1)
206 , benchIOSink value "reverse'" (reverse' 1)
237 , benchIOSink value "reverse'" (reverse' 1)
208 , benchIOSink value "mkAsync" (mkAsync fromSerial)
240 , benchIOSink value "mkAsync" (mkAsync fromSerial)
@@ -213,25 +246,26 @@ o_n_heap_buffering value =
213-- Grouping/Splitting
246-- Grouping/Splitting
214-------------------------------------------------------------------------------
247-------------------------------------------------------------------------------
216{-# INLINE classifySessionsOf #-}
250{-# INLINE classifySessionsOf #-}
217−classifySessionsOf :: S.MonadAsync m => (Int -> Int) -> SerialT m Int -> m ()
251+classifySessionsOf :: MonadAsync m => (Int -> Int) -> SerialT m Int -> m ()
218classifySessionsOf getKey =
252classifySessionsOf getKey =
219− S.drain
253+ Common.drain
220− . Internal.classifySessionsOf
254+ . S.classifySessionsOf
221 (const (return False)) 3 (FL.take 10 FL.sum)
255 (const (return False)) 3 (FL.take 10 FL.sum)
222− . Internal.timestamped
256+ . S.timestamped
223− . S.map (\x -> (getKey x, x))
257+ . fmap (\x -> (getKey x, x))
225{-# INLINE classifySessionsOfHash #-}
259{-# INLINE classifySessionsOfHash #-}
226−classifySessionsOfHash :: S.MonadAsync m =>
260+classifySessionsOfHash :: MonadAsync m =>
227 (Int -> Int) -> SerialT m Int -> m ()
261 (Int -> Int) -> SerialT m Int -> m ()
228classifySessionsOfHash getKey =
262classifySessionsOfHash getKey =
229− S.drain
263+ Common.drain
230− . Internal.classifySessionsByGeneric
264+ . S.classifySessionsByGeneric
231 (Proxy :: Proxy (HashMap k))
265 (Proxy :: Proxy (HashMap k))
232 1 False (const (return False)) 3 (FL.take 10 FL.sum)
266 1 False (const (return False)) 3 (FL.take 10 FL.sum)
233− . Internal.timestamped
267+ . S.timestamped
234− . S.map (\x -> (getKey x, x))
268+ . fmap (\x -> (getKey x, x))
236o_n_space_grouping :: Int -> [Benchmark]
270o_n_space_grouping :: Int -> [Benchmark]
237o_n_space_grouping value =
271o_n_space_grouping value =
@@ -251,6 +285,7 @@ o_n_space_grouping value =
253 getKey n = (`mod` n)
287 getKey n = (`mod` n)
255-------------------------------------------------------------------------------
290-------------------------------------------------------------------------------
256-- Mixed Transformation
291-- Mixed Transformation
@@ -258,15 +293,15 @@ o_n_space_grouping value =
259{-# INLINE scanMap #-}
294{-# INLINE scanMap #-}
260scanMap :: MonadIO m => Int -> SerialT m Int -> m ()
295scanMap :: MonadIO m => Int -> SerialT m Int -> m ()
261−scanMap n = composeN n $ S.map (subtract 1) . S.scanl' (+) 0
296+scanMap n = composeN n $ fmap (subtract 1) . Common.scanl' (+) 0
263{-# INLINE dropMap #-}
298{-# INLINE dropMap #-}
264dropMap :: MonadIO m => Int -> SerialT m Int -> m ()
299dropMap :: MonadIO m => Int -> SerialT m Int -> m ()
265−dropMap n = composeN n $ S.map (subtract 1) . S.drop 1
300+dropMap n = composeN n $ fmap (subtract 1) . S.drop 1
267{-# INLINE dropScan #-}
302{-# INLINE dropScan #-}
268dropScan :: MonadIO m => Int -> SerialT m Int -> m ()
303dropScan :: MonadIO m => Int -> SerialT m Int -> m ()
269−dropScan n = composeN n $ S.scanl' (+) 0 . S.drop 1
304+dropScan n = composeN n $ Common.scanl' (+) 0 . S.drop 1
271{-# INLINE takeDrop #-}
306{-# INLINE takeDrop #-}
272takeDrop :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
307takeDrop :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
@@ -274,11 +309,11 @@ takeDrop value n = composeN n $ S.drop 1 . S.take (value + 1)
275{-# INLINE takeScan #-}
310{-# INLINE takeScan #-}
276takeScan :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
311takeScan :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
277−takeScan value n = composeN n $ S.scanl' (+) 0 . S.take (value + 1)
312+takeScan value n = composeN n $ Common.scanl' (+) 0 . S.take (value + 1)
279{-# INLINE takeMap #-}
314{-# INLINE takeMap #-}
280takeMap :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
315takeMap :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
281−takeMap value n = composeN n $ S.map (subtract 1) . S.take (value + 1)
316+takeMap value n = composeN n $ fmap (subtract 1) . S.take (value + 1)
283{-# INLINE filterDrop #-}
318{-# INLINE filterDrop #-}
284filterDrop :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
319filterDrop :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
@@ -290,15 +325,17 @@ filterTake value n = composeN n $ S.take (value + 1) . S.filter (<= (value + 1))
291{-# INLINE filterScan #-}
326{-# INLINE filterScan #-}
292filterScan :: MonadIO m => Int -> SerialT m Int -> m ()
327filterScan :: MonadIO m => Int -> SerialT m Int -> m ()
293−filterScan n = composeN n $ S.scanl' (+) 0 . S.filter (<= maxBound)
328+filterScan n = composeN n $ Common.scanl' (+) 0 . S.filter (<= maxBound)
295{-# INLINE filterScanl1 #-}
331{-# INLINE filterScanl1 #-}
296filterScanl1 :: MonadIO m => Int -> SerialT m Int -> m ()
332filterScanl1 :: MonadIO m => Int -> SerialT m Int -> m ()
297filterScanl1 n = composeN n $ S.scanl1' (+) . S.filter (<= maxBound)
333filterScanl1 n = composeN n $ S.scanl1' (+) . S.filter (<= maxBound)
299{-# INLINE filterMap #-}
336{-# INLINE filterMap #-}
300filterMap :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
337filterMap :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
301−filterMap value n = composeN n $ S.map (subtract 1) . S.filter (<= (value + 1))
338+filterMap value n = composeN n $ fmap (subtract 1) . S.filter (<= (value + 1))
303-------------------------------------------------------------------------------
340-------------------------------------------------------------------------------
304-- Scan and fold
341-- Scan and fold
@@ -310,17 +347,17 @@ data Pair a b =
311{-# INLINE sumProductFold #-}
348{-# INLINE sumProductFold #-}
312sumProductFold :: Monad m => SerialT m Int -> m (Int, Int)
349sumProductFold :: Monad m => SerialT m Int -> m (Int, Int)
313−sumProductFold = S.foldl' (\(s, p) x -> (s + x, p * x)) (0, 1)
350+sumProductFold = Common.foldl' (\(s, p) x -> (s + x, p * x)) (0, 1)
315{-# INLINE sumProductScan #-}
352{-# INLINE sumProductScan #-}
316sumProductScan :: Monad m => SerialT m Int -> m (Pair Int Int)
353sumProductScan :: Monad m => SerialT m Int -> m (Pair Int Int)
317sumProductScan =
354sumProductScan =
318− S.foldl' (\(Pair _ p) (s0, x) -> Pair s0 (p * x)) (Pair 0 1) .
355+ Common.foldl' (\(Pair _ p) (s0, x) -> Pair s0 (p * x)) (Pair 0 1) .
319− S.scanl' (\(s, _) x -> (s + x, x)) (0, 0)
356+ Common.scanl' (\(s, _) x -> (s + x, x)) (0, 0)
321{-# INLINE foldl'ReduceMap #-}
358{-# INLINE foldl'ReduceMap #-}
322foldl'ReduceMap :: Monad m => SerialT m Int -> m Int
359foldl'ReduceMap :: Monad m => SerialT m Int -> m Int
323−foldl'ReduceMap = fmap (+ 1) . S.foldl' (+) 0
360+foldl'ReduceMap = fmap (+ 1) . Common.foldl' (+) 0
325o_1_space_transformations_mixed :: Int -> [Benchmark]
362o_1_space_transformations_mixed :: Int -> [Benchmark]
326o_1_space_transformations_mixed value =
363o_1_space_transformations_mixed value =
@@ -347,7 +384,9 @@ o_1_space_transformations_mixedX4 value =
347 , benchIOSink value "filter-drop" (filterDrop value 4)
384 , benchIOSink value "filter-drop" (filterDrop value 4)
348 , benchIOSink value "filter-take" (filterTake value 4)
385 , benchIOSink value "filter-take" (filterTake value 4)
349 , benchIOSink value "filter-scan" (filterScan 4)
386 , benchIOSink value "filter-scan" (filterScan 4)
350 , benchIOSink value "filter-scanl1" (filterScanl1 4)
388 , benchIOSink value "filter-scanl1" (filterScanl1 4)
351 , benchIOSink value "filter-map" (filterMap value 4)
390 , benchIOSink value "filter-map" (filterMap value 4)
@@ -358,40 +397,43 @@ o_1_space_transformations_mixedX4 value =
359-- this is quadratic
398-- this is quadratic
360{-# INLINE iterateScan #-}
399{-# INLINE iterateScan #-}
361−iterateScan :: S.MonadAsync m => Int -> Int -> Int -> SerialT m Int
400+iterateScan :: MonadAsync m => Int -> Int -> Int -> SerialT m Int
362−iterateScan = iterateSource (S.scanl' (+) 0)
401+iterateScan = iterateSource (Common.scanl' (+) 0)
364-- this is quadratic
404-- this is quadratic
365{-# INLINE iterateScanl1 #-}
405{-# INLINE iterateScanl1 #-}
366−iterateScanl1 :: S.MonadAsync m => Int -> Int -> Int -> SerialT m Int
406+iterateScanl1 :: MonadAsync m => Int -> Int -> Int -> SerialT m Int
367iterateScanl1 = iterateSource (S.scanl1' (+))
407iterateScanl1 = iterateSource (S.scanl1' (+))
369{-# INLINE iterateMapM #-}
410{-# INLINE iterateMapM #-}
370−iterateMapM :: S.MonadAsync m => Int -> Int -> Int -> SerialT m Int
411+iterateMapM :: MonadAsync m => Int -> Int -> Int -> SerialT m Int
371iterateMapM = iterateSource (S.mapM return)
412iterateMapM = iterateSource (S.mapM return)
373{-# INLINE iterateFilterEven #-}
414{-# INLINE iterateFilterEven #-}
374−iterateFilterEven :: S.MonadAsync m => Int -> Int -> Int -> SerialT m Int
415+iterateFilterEven :: MonadAsync m => Int -> Int -> Int -> SerialT m Int
375iterateFilterEven = iterateSource (S.filter even)
416iterateFilterEven = iterateSource (S.filter even)
377{-# INLINE iterateTakeAll #-}
418{-# INLINE iterateTakeAll #-}
378−iterateTakeAll :: S.MonadAsync m => Int -> Int -> Int -> Int -> SerialT m Int
419+iterateTakeAll :: MonadAsync m => Int -> Int -> Int -> Int -> SerialT m Int
379iterateTakeAll value = iterateSource (S.take (value + 1))
420iterateTakeAll value = iterateSource (S.take (value + 1))
381{-# INLINE iterateDropOne #-}
422{-# INLINE iterateDropOne #-}
382−iterateDropOne :: S.MonadAsync m => Int -> Int -> Int -> SerialT m Int
423+iterateDropOne :: MonadAsync m => Int -> Int -> Int -> SerialT m Int
383iterateDropOne = iterateSource (S.drop 1)
424iterateDropOne = iterateSource (S.drop 1)
385{-# INLINE iterateDropWhileFalse #-}
426{-# INLINE iterateDropWhileFalse #-}
386−iterateDropWhileFalse :: S.MonadAsync m
427+iterateDropWhileFalse :: MonadAsync m
387 => Int -> Int -> Int -> Int -> SerialT m Int
428 => Int -> Int -> Int -> Int -> SerialT m Int
388iterateDropWhileFalse value = iterateSource (S.dropWhile (> (value + 1)))
429iterateDropWhileFalse value = iterateSource (S.dropWhile (> (value + 1)))
390{-# INLINE iterateDropWhileTrue #-}
431{-# INLINE iterateDropWhileTrue #-}
391−iterateDropWhileTrue :: S.MonadAsync m
432+iterateDropWhileTrue :: MonadAsync m
392 => Int -> Int -> Int -> Int -> SerialT m Int
433 => Int -> Int -> Int -> Int -> SerialT m Int
393iterateDropWhileTrue value = iterateSource (S.dropWhile (<= (value + 1)))
434iterateDropWhileTrue value = iterateSource (S.dropWhile (<= (value + 1)))
395{-# INLINE tail #-}
437{-# INLINE tail #-}
396tail :: Monad m => SerialT m a -> m ()
438tail :: Monad m => SerialT m a -> m ()
397tail s = S.tail s >>= mapM_ tail
439tail s = S.tail s >>= mapM_ tail
@@ -403,26 +445,31 @@ nullHeadTail s = do
403 when (not r) $ do
445 when (not r) $ do
404 _ <- S.head s
446 _ <- S.head s
405 S.tail s >>= mapM_ nullHeadTail
447 S.tail s >>= mapM_ nullHeadTail
407-- Head recursive operations.
450-- Head recursive operations.
408o_n_stack_iterated :: Int -> [Benchmark]
451o_n_stack_iterated :: Int -> [Benchmark]
409o_n_stack_iterated value = by10 `seq` by100 `seq`
452o_n_stack_iterated value = by10 `seq` by100 `seq`
410 [ bgroup "iterated"
453 [ bgroup "iterated"
411− [ benchIOSrc fromSerial "mapM (n/10 x 10)" $ iterateMapM by10 10
454+ [ benchIOSrc "mapM (n/10 x 10)" $ iterateMapM by10 10
412− , benchIOSrc fromSerial "scanl' (quadratic) (n/100 x 100)" $
455+ , benchIOSrc "scanl' (quadratic) (n/100 x 100)" $
413 iterateScan by100 100
456 iterateScan by100 100
414− , benchIOSrc fromSerial "scanl1' (n/10 x 10)" $ iterateScanl1 by10 10
458+ , benchIOSrc "scanl1' (n/10 x 10)" $ iterateScanl1 by10 10
415− , benchIOSrc fromSerial "filterEven (n/10 x 10)" $
460+ , benchIOSrc "filterEven (n/10 x 10)" $
416 iterateFilterEven by10 10
461 iterateFilterEven by10 10
417− , benchIOSrc fromSerial "takeAll (n/10 x 10)" $
462+ , benchIOSrc "takeAll (n/10 x 10)" $
418 iterateTakeAll value by10 10
463 iterateTakeAll value by10 10
419− , benchIOSrc fromSerial "dropOne (n/10 x 10)" $ iterateDropOne by10 10
464+ , benchIOSrc "dropOne (n/10 x 10)" $ iterateDropOne by10 10
420− , benchIOSrc fromSerial "dropWhileFalse (n/10 x 10)" $
465+ , benchIOSrc "dropWhileFalse (n/10 x 10)" $
421 iterateDropWhileFalse value by10 10
466 iterateDropWhileFalse value by10 10
422− , benchIOSrc fromSerial "dropWhileTrue (n/10 x 10)" $
467+ , benchIOSrc "dropWhileTrue (n/10 x 10)" $
423 iterateDropWhileTrue value by10 10
468 iterateDropWhileTrue value by10 10
424 , benchIOSink value "tail" tail
470 , benchIOSink value "tail" tail
425 , benchIOSink value "nullHeadTail" nullHeadTail
471 , benchIOSink value "nullHeadTail" nullHeadTail
@@ -438,12 +485,12 @@ o_n_stack_iterated value = by10 `seq` by100 `seq`
438o_1_space_pipes :: Int -> [Benchmark]
485o_1_space_pipes :: Int -> [Benchmark]
439o_1_space_pipes value =
486o_1_space_pipes value =
440 [ bgroup "pipes"
487 [ bgroup "pipes"
441− [ benchIOSink value "mapM" (transformMapM fromSerial 1)
488+ [ benchIOSink value "mapM" (transformMapM 1)
442− , benchIOSink value "compose" (transformComposeMapM fromSerial 1)
489+ , benchIOSink value "compose" (transformComposeMapM 1)
443− , benchIOSink value "tee" (transformTeeMapM fromSerial 1)
490+ , benchIOSink value "tee" (transformTeeMapM 1)
444#ifdef DEVBUILD
491#ifdef DEVBUILD
445 -- XXX this take 1 GB memory to compile
492 -- XXX this take 1 GB memory to compile
446− , benchIOSink value "zip" (transformZipMapM fromSerial 1)
493+ , benchIOSink value "zip" (transformZipMapM 1)
@@ -451,12 +498,12 @@ o_1_space_pipes value =
451o_1_space_pipesX4 :: Int -> [Benchmark]
498o_1_space_pipesX4 :: Int -> [Benchmark]
452o_1_space_pipesX4 value =
499o_1_space_pipesX4 value =
453 [ bgroup "pipesX4"
500 [ bgroup "pipesX4"
454− [ benchIOSink value "mapM" (transformMapM fromSerial 4)
501+ [ benchIOSink value "mapM" (transformMapM 4)
455− , benchIOSink value "compose" (transformComposeMapM fromSerial 4)
502+ , benchIOSink value "compose" (transformComposeMapM 4)
456− , benchIOSink value "tee" (transformTeeMapM fromSerial 4)
503+ , benchIOSink value "tee" (transformTeeMapM 4)
457#ifdef DEVBUILD
504#ifdef DEVBUILD
458 -- XXX this take 1 GB memory to compile
505 -- XXX this take 1 GB memory to compile
459− , benchIOSink value "zip" (transformZipMapM fromSerial 4)
506+ , benchIOSink value "zip" (transformZipMapM 4)
@@ -481,8 +528,12 @@ benchmarks moduleName size =
482 , bgroup (o_n_stack_prefix moduleName) (o_n_stack_iterated size)
529 , bgroup (o_n_stack_prefix moduleName) (o_n_stack_iterated size)
483 , bgroup (o_n_heap_prefix moduleName) $ Prelude.concat
530 , bgroup (o_n_heap_prefix moduleName) $ Prelude.concat
484− [ o_n_space_grouping size
533+ o_n_space_grouping size
485− , o_n_space_functor size
536+ o_n_space_functor size
486 , o_n_heap_buffering size
537 , o_n_heap_buffering size