@@ -11,6 +11,7 @@
11-- Maintainer : streamly@composewell.com
11-- Maintainer : streamly@composewell.com
13import Control.DeepSeq (NFData(..), deepseq)
13import Control.DeepSeq (NFData(..), deepseq)
14+import Control.Monad (when)
14import Data.Functor.Identity (Identity, runIdentity)
15import Data.Functor.Identity (Identity, runIdentity)
15import Data.Monoid (Last(..))
16import Data.Monoid (Last(..))
16import System.Random (randomRIO)
17import System.Random (randomRIO)
@@ -129,7 +130,13 @@ main :: IO ()
130 -- XXX Fix indentation
131 -- XXX Fix indentation
131 (value, cfg, benches) <- parseCLIOpts defaultStreamSize
132 (value, cfg, benches) <- parseCLIOpts defaultStreamSize
133+ let bufValue = min value defaultStreamSize
134+ when (bufValue /= value) $
135+ putStrLn $ "Limiting stream size to "
136+ ++ show defaultStreamSize
137+ ++ " for buffered operations"
132− value `seq` runMode (mode cfg) cfg benches
139+ bufValue `seq` value `seq` runMode (mode cfg) cfg benches
133 [ bgroup "serially"
140 [ bgroup "serially"
134 [ bgroup "pure"
141 [ bgroup "pure"
135 [ benchPureSink value "id" id
142 [ benchPureSink value "id" id
@@ -458,53 +465,53 @@ main = do
459 -- Right folds for reducing are inherently non-streaming as the
466 -- Right folds for reducing are inherently non-streaming as the
460 -- expression needs to be fully built before it can be reduced.
467 -- expression needs to be fully built before it can be reduced.
461− benchIOSink value "foldrM/reduce/IO" Ops.foldrMReduce
468+ benchIOSink bufValue "foldrM/reduce/IO" Ops.foldrMReduce
462− , benchIdentitySink value "foldrM/reduce/Identity" Ops.foldrMReduce
469+ , benchIdentitySink bufValue "foldrM/reduce/Identity" Ops.foldrMReduce
464 -- Left folds for building a structure are inherently non-streaming as
471 -- Left folds for building a structure are inherently non-streaming as
465 -- the structure cannot be lazily consumed until fully built.
472 -- the structure cannot be lazily consumed until fully built.
466− , benchIOSink value "foldl'/build/IO" Ops.foldl'Build
473+ , benchIOSink bufValue "foldl'/build/IO" Ops.foldl'Build
467− , benchIdentitySink value "foldl'/build/Identity" Ops.foldl'Build
474+ , benchIdentitySink bufValue "foldl'/build/Identity" Ops.foldl'Build
468− , benchIOSink value "foldlM'/build/IO" Ops.foldlM'Build
475+ , benchIOSink bufValue "foldlM'/build/IO" Ops.foldlM'Build
469− , benchIdentitySink value "foldlM'/build/Identity" Ops.foldlM'Build
476+ , benchIdentitySink bufValue "foldlM'/build/Identity" Ops.foldlM'Build
471 -- accumulation due to strictness of IO monad
478 -- accumulation due to strictness of IO monad
472− , benchIOSink value "foldrM/build/IO" Ops.foldrMBuild
479+ , benchIOSink bufValue "foldrM/build/IO" Ops.foldrMBuild
473− , benchPureSinkIO value "traversable/mapM" Ops.traversableMapM
480+ , benchPureSinkIO bufValue "traversable/mapM" Ops.traversableMapM
475 -- Converting the stream to a list or pure stream
482 -- Converting the stream to a list or pure stream
476− , benchIOSink value "toList" Ops.toList
483+ , benchIOSink bufValue "toList" Ops.toList
477− , benchIOSink value "toListRev" Ops.toListRev
484+ , benchIOSink bufValue "toListRev" Ops.toListRev
478− , benchIOSink value "toStream" (S.fold IP.toStream)
485+ , benchIOSink bufValue "toStream" (S.fold IP.toStream)
479− , benchIOSink value "toStreamRev" (S.fold IP.toStreamRev)
486+ , benchIOSink bufValue "toStreamRev" (S.fold IP.toStreamRev)
481− , benchIOSink value "folds/toList" (S.fold FL.toList)
488+ , benchIOSink bufValue "folds/toList" (S.fold FL.toList)
482− , benchIOSink value "folds/toListRevF" (S.fold IFL.toListRevF)
489+ , benchIOSink bufValue "folds/toListRevF" (S.fold IFL.toListRevF)
484 -- Converting the stream to an array
491 -- Converting the stream to an array
485− , benchIOSink value "folds/lastN.Max" (S.fold (IA.lastN (value + 1)))
492+ , benchIOSink bufValue "folds/lastN.Max" (S.fold (IA.lastN (bufValue + 1)))
486− , benchIOSink value "folds/writeN" (S.fold (A.writeN value))
493+ , benchIOSink bufValue "folds/writeN" (S.fold (A.writeN bufValue))
488 -- Reversing/sorting a stream
495 -- Reversing/sorting a stream
489− , benchIOSink value "reverse" (Ops.reverse 1)
496+ , benchIOSink bufValue "reverse" (Ops.reverse 1)
490− , benchIOSink value "reverse'" (Ops.reverse' 1)
497+ , benchIOSink bufValue "reverse'" (Ops.reverse' 1)
492 -- XXX can these be streaming? Can we have special read/show style type
499 -- XXX can these be streaming? Can we have special read/show style type
493 -- classes supporting streaming?
500 -- classes supporting streaming?
494− , mkString value `deepseq` (bench "readsPrec pure streams" $
501+ , mkString bufValue `deepseq` (bench "readsPrec pure streams" $
495− nf Ops.readInstance (mkString value))
502+ nf Ops.readInstance (mkString bufValue))
496− , mkString value `deepseq` (bench "readsPrec Haskell lists" $
503+ , mkString bufValue `deepseq` (bench "readsPrec Haskell lists" $
497− nf Ops.readInstanceList (mkListString value))
504+ nf Ops.readInstanceList (mkListString bufValue))
498− , mkList value `deepseq` (bench "showPrec Haskell lists" $
505+ , mkList bufValue `deepseq` (bench "showPrec Haskell lists" $
499− nf Ops.showInstanceList (mkList value))
506+ nf Ops.showInstanceList (mkList bufValue))
501 -- XXX streaming operations that can potentially be fixed
508 -- XXX streaming operations that can potentially be fixed
502− , benchPureSink value "foldable/sum" Ops.foldableSum
509+ , benchPureSink bufValue "foldable/sum" Ops.foldableSum
503− , benchIOSink value "tail" Ops.tail
510+ , benchIOSink bufValue "tail" Ops.tail
504− , benchIOSink value "nullHeadTail" Ops.nullHeadTail
511+ , benchIOSink bufValue "nullHeadTail" Ops.nullHeadTail
505 , benchIOSrc1 "concatUnfoldInterleaveRepl (x/4,4)"
512 , benchIOSrc1 "concatUnfoldInterleaveRepl (x/4,4)"
506− (Ops.concatUnfoldInterleaveRepl4xN value)
513+ (Ops.concatUnfoldInterleaveRepl4xN bufValue)
507 , benchIOSrc1 "concatUnfoldRoundrobinRepl (x/4,4)"
514 , benchIOSrc1 "concatUnfoldRoundrobinRepl (x/4,4)"
508− (Ops.concatUnfoldRoundrobinRepl4xN value)
515+ (Ops.concatUnfoldRoundrobinRepl4xN bufValue)