on master help sign in
Use foldrSShared instead of foldrS for Async

Because of not sharing the SVar foldrS performs poorly for Async streams and has quadratic complexity.

commit1cccb0010116136be69826e8e4616b4d94c53de9 authorHarendra Kumar <harendra@composewell.com> dateSun 21 Jun 2020, 02:01 (6 years ago) parentc0bd11d
2 files changed+7−16
benchmark/Streamly/Benchmark/Prelude/Async.hs+6−16 src/Streamly/Internal/Data/Stream/StreamK/Type.hs+1
benchmark/Streamly/Benchmark/Prelude/Async.hs+6−16
@@ -9,7 +9,7 @@ import Prelude hiding (mapM)
99
1010import Streamly (asyncly, async, maxBuffer, maxThreads, serially)
1111import qualified Streamly.Prelude as S
12−import qualified Streamly.Internal.Prelude as Internal
12+import qualified Streamly.Internal.Data.Stream.StreamK.Type as Internal
1313
1414import Streamly.Benchmark.Common
1515import Streamly.Benchmark.Prelude
@@ -43,15 +43,12 @@ o_1_space_generation value =
4343-- Mapping
4444-------------------------------------------------------------------------------
4545
46−-- XXX this should be same as mapM return
47−-- XXX this has quadratic slowdown with async, but works well on serial
48−-- streams.
49−{-# INLINE foldrS #-}
50−foldrS :: Int -> Int -> IO ()
51−foldrS count n =
46+{-# INLINE foldrSShared #-}
47+foldrSShared :: Int -> Int -> IO ()
48+foldrSShared count n =
5249 S.drain
5350 $ asyncly
54− $ Internal.foldrS (\x xs -> S.consM (return x) xs) S.nil
51+ $ Internal.foldrSShared (\x xs -> S.consM (return x) xs) S.nil
5552 $ serially
5653 $ sourceUnfoldrM count n
5754
@@ -60,18 +57,12 @@ o_1_space_mapping value =
6057 [ bgroup "mapping"
6158 [ benchIOSink value "map" $ mapN asyncly 1
6259 , benchIOSink value "fmap" $ fmapN asyncly 1
60+ , benchIOSrc1 "foldrSShared" (foldrSShared value)
6361 -- This basically tests the performance of consMAsync
6462 , benchIOSink value "mapM" $ mapM asyncly 1 . serially
6563 ]
6664 ]
6765
68−o_n_heap_mapping :: Int -> [Benchmark]
69−o_n_heap_mapping _value =
70− [ bgroup "mapping"
71− [ benchIOSrc1 "foldrS (600)" (foldrS 600)
72− ]
73− ]
74−
7566-------------------------------------------------------------------------------
7667-- Joining
7768-------------------------------------------------------------------------------
@@ -195,6 +186,5 @@ main = do
195186 , o_1_space_outerProduct value
196187 , o_1_space_joining value
197188 ]
198− , bgroup (o_n_heap_prefix moduleName) (o_n_heap_mapping value)
199189 , bgroup (o_n_space_prefix moduleName) (o_n_space_outerProduct value)
200190 ]
src/Streamly/Internal/Data/Stream/StreamK/Type.hs+1
@@ -51,6 +51,7 @@ module Streamly.Internal.Data.Stream.StreamK.Type
5151 -- * foldr/build
5252 , foldrM
5353 , foldrS
54+ , foldrSShared
5455 , foldrSM
5556 , build
5657 , buildS