Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions benchmark/Streamly/Benchmark/Data/Stream/Expand.hs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,21 @@ inspect $ hasNoTypeClasses 'bfsUnfoldEach
-- ''S.ConcatUnfoldInterleaveState
#endif

{-# INLINE altBfsUnfoldEach #-}
altBfsUnfoldEach :: Int -> Int -> Int -> IO ()
altBfsUnfoldEach outer inner n =
S.drain $ S.altBfsUnfoldEach
-- (UF.lmap return (UF.replicateM inner))
(UF.lmap (\x -> (x,x)) (sourceUnfoldrMUF inner))
(sourceUnfoldrM outer n)

#ifdef INSPECTION
inspect $ hasNoTypeClasses 'altBfsUnfoldEach
-- inspect $ 'altBfsUnfoldEach `hasNoType` ''SPEC
-- inspect $ 'altBfsUnfoldEach `hasNoType`
-- ''S.ConcatUnfoldInterleaveState
#endif

{-# INLINE unfoldSched #-}
unfoldSched :: Int -> Int -> Int -> IO ()
unfoldSched outer inner n =
Expand Down Expand Up @@ -245,6 +260,7 @@ o_1_space_joining value =

-- join 2 streams using n-ary ops
, benchIOSrc1 "bfsUnfoldEach" (bfsUnfoldEach 2 (value `div` 2))
, benchIOSrc1 "altBfsUnfoldEach" (altBfsUnfoldEach 2 (value `div` 2))
, benchIOSrc1 "unfoldSched" (unfoldSched 2 (value `div` 2))
, benchIOSrc1 "concatMap" (concatMap 2 (value `div` 2))
]
Expand Down Expand Up @@ -432,6 +448,13 @@ o_n_heap_concat value = sqrtVal `seq`
"bfsUnfoldEach (sqrtVal of sqrtVal)"
(bfsUnfoldEach sqrtVal sqrtVal)

, benchIOSrc1
"altBfsUnfoldEach (n of 1)"
(altBfsUnfoldEach value 1)
, benchIOSrc1
"altBfsUnfoldEach (sqrtVal of sqrtVal)"
(altBfsUnfoldEach sqrtVal sqrtVal)

, benchIOSrc1
"unfoldSched (n of 1)"
(unfoldSched value 1)
Expand Down Expand Up @@ -461,13 +484,49 @@ cross2 linearCount start = drain $

nestedCount2 = round (fromIntegral linearCount**(1/2::Double))

{-# INLINE crossApply #-}
crossApply :: MonadAsync m => Int -> Int -> m ()
crossApply linearCount start = drain $
Stream.crossApply
((+) <$> sourceUnfoldrM nestedCount2 start)
(sourceUnfoldrM nestedCount2 start)

where

nestedCount2 = round (fromIntegral linearCount**(1/2::Double))

{-# INLINE crossApplyFst #-}
crossApplyFst :: MonadAsync m => Int -> Int -> m ()
crossApplyFst linearCount start = drain $
Stream.crossApplyFst
(sourceUnfoldrM nestedCount2 start)
(sourceUnfoldrM nestedCount2 start)

where

nestedCount2 = round (fromIntegral linearCount**(1/2::Double))

{-# INLINE crossApplySnd #-}
crossApplySnd :: MonadAsync m => Int -> Int -> m ()
crossApplySnd linearCount start = drain $
Stream.crossApplySnd
(sourceUnfoldrM nestedCount2 start)
(sourceUnfoldrM nestedCount2 start)

where

nestedCount2 = round (fromIntegral linearCount**(1/2::Double))

o_1_space_applicative :: Int -> [Benchmark]
o_1_space_applicative value =
[ bgroup "Applicative"
[ benchIO "(*>)" $ apDiscardFst value
, benchIO "(<*)" $ apDiscardSnd value
, benchIO "(<*>)" $ toNullAp value
, benchIO "liftA2" $ apLiftA2 value
, benchIO "crossApply" $ crossApply value
, benchIO "crossApplyFst" $ crossApplyFst value
, benchIO "crossApplySnd" $ crossApplySnd value
, benchIO "pureDrain2" $ toNullApPure value
, benchIO "pureCross2" $ cross2 value
]
Expand Down
11 changes: 11 additions & 0 deletions benchmark/Streamly/Benchmark/Data/Stream/Generate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@ import Prelude hiding (repeat, replicate, iterate)
sourceFromList :: Monad m => Int -> Int -> Stream m Int
sourceFromList value n = Stream.fromList [n..n+value]

-- | 'fromTuple' yields two elements per tuple. To emit and drain ~value
-- elements we generate value/2 tuples and reduce each tuple's 'fromTuple'
-- stream with a light 'sum' fold (avoiding a heavy, non-fusible 'concatMap'
-- that would mask the cost of 'fromTuple').
{-# INLINE sourceFromTuple #-}
sourceFromTuple :: Monad m => Int -> Int -> Stream m Int
sourceFromTuple value n =
Stream.mapM (Stream.fold Fold.sum . Stream.fromTuple)
$ Stream.fromList (fmap (\i -> (i, i)) [n .. n + value `div` 2])

{-# INLINE sourceFromListM #-}
sourceFromListM :: MonadAsync m => Int -> Int -> Stream m Int
sourceFromListM value n = fromListM (fmap return [n..n+value])
Expand Down Expand Up @@ -168,6 +178,7 @@ o_1_space_generation value =
, benchIOSrc "fracFromThenTo" (sourceFracFromThenTo value)
, benchIOSrc "fracFromTo" (sourceFracFromTo value)
, benchIOSrc "fromList" (sourceFromList value)
, benchIOSrc "fromTuple" (sourceFromTuple value)
, benchIOSrc "fromListM" (sourceFromListM value)
, benchPureSrc "IsList.fromList" (sourceIsList value)
, benchPureSrc "IsString.fromString" (sourceIsString value)
Expand Down
Loading
Loading