on master help sign in
Add benchmarks iterating the same op multiple times
commitb4f9c6912e77da24f3ae94dccef0e2d2a258300a authorHarendra Kumar <harendra.kumar@gmail.com> dateWed 31 Oct 2018, 00:00 (8 years ago) parentfcaf8bb
3 files changed+53
benchmark/Chart.hs+7 benchmark/Linear.hs+9 benchmark/LinearOps.hs+37
benchmark/Chart.hs+7
@@ -132,6 +132,13 @@ makeLinearGraphs cfg inputFile = do
132132 fmap ("Streamly",) . stripPrefix "serially/composed/"
133133 }
134134
135+ ignoringErr $ graph inputFile "iterated"
136+ $ cfg
137+ { title = Just "Iterated Ops"
138+ , classifyBenchmark =
139+ fmap ("Streamly",) . stripPrefix "serially/iterated/"
140+ }
141+
135142------------------------------------------------------------------------------
136143-- Nested composition charts
137144------------------------------------------------------------------------------
benchmark/Linear.hs+9
@@ -145,5 +145,14 @@ main =
145145 , benchIO "filter-scan" (Ops.filterScan 4)
146146 , benchIO "filter-map" (Ops.filterMap 4)
147147 ]
148+ , bgroup "iterated"
149+ [ benchSrcIO serially "mapM" Ops.iterateMapM
150+ , benchSrcIO serially "scan" Ops.iterateScan
151+ , benchSrcIO serially "filterEven" Ops.iterateFilterEven
152+ , benchSrcIO serially "takeAll" Ops.iterateTakeAll
153+ , benchSrcIO serially "dropOne" Ops.iterateDropOne
154+ , benchSrcIO serially "dropWhileFalse" Ops.iterateDropWhileFalse
155+ , benchSrcIO serially "dropWhileTrue" Ops.iterateDropWhileTrue
156+ ]
148157 ]
149158 ]
benchmark/LinearOps.hs+37
@@ -7,6 +7,7 @@
77
88{-# LANGUAGE CPP #-}
99{-# LANGUAGE FlexibleContexts #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
1011
1112module LinearOps where
1213
@@ -16,6 +17,7 @@ import Prelude
1617 (Monad, Int, (+), ($), (.), return, fmap, even, (>), (<=), (==), (<=),
1718 subtract, undefined, Maybe(..), odd, Bool, not, (>>=), mapM_, curry,
1819 maxBound)
20+import qualified Prelude as P
1921
2022import qualified Streamly as S
2123import qualified Streamly.Prelude as S
@@ -285,6 +287,41 @@ dropWhileMTrue n = composeN n $ S.dropWhileM (return . (<= maxValue))
285287findIndices n = composeN n $ S.findIndices (== maxValue)
286288elemIndices n = composeN n $ S.elemIndices maxValue
287289
290+-------------------------------------------------------------------------------
291+-- Iteration
292+-------------------------------------------------------------------------------
293+
294+{-# INLINE iterateSource #-}
295+iterateSource
296+ :: S.MonadAsync m
297+ => (Stream m Int -> Stream m Int) -> Int -> Int -> Stream m Int
298+iterateSource g i n = f i (sourceUnfoldrMN 10 n)
299+ where
300+ f (0 :: Int) m = g m
301+ f x m = g (f (x P.- 1) m)
302+
303+{-# INLINE iterateMapM #-}
304+{-# INLINE iterateScan #-}
305+{-# INLINE iterateFilterEven #-}
306+{-# INLINE iterateTakeAll #-}
307+{-# INLINE iterateDropOne #-}
308+{-# INLINE iterateDropWhileFalse #-}
309+{-# INLINE iterateDropWhileTrue #-}
310+iterateMapM, iterateScan, iterateFilterEven, iterateTakeAll, iterateDropOne,
311+ iterateDropWhileFalse, iterateDropWhileTrue
312+ :: S.MonadAsync m
313+ => Int -> Stream m Int
314+
315+-- this is quadratic
316+iterateScan = iterateSource (S.scanl' (+) 0) 1000
317+
318+iterateMapM = iterateSource (S.mapM return) 100000
319+iterateFilterEven = iterateSource (S.filter even) 100000
320+iterateTakeAll = iterateSource (S.take maxValue) 100000
321+iterateDropOne = iterateSource (S.drop 1) 100000
322+iterateDropWhileFalse = iterateSource (S.dropWhile (<= 1)) 100000
323+iterateDropWhileTrue = iterateSource (S.dropWhile (<= maxValue)) 100000
324+
288325-------------------------------------------------------------------------------
289326-- Zipping and concat
290327-------------------------------------------------------------------------------