@@ -14,6 +14,8 @@ import Control.DeepSeq (NFData(..), deepseq)
14import Data.Functor.Identity (Identity, runIdentity)
14import Data.Functor.Identity (Identity, runIdentity)
15import System.Random (randomRIO)
15import System.Random (randomRIO)
16import Data.Monoid (Last(..))
16import Data.Monoid (Last(..))
17+import System.Environment (getArgs)
18+import Text.Read (readMaybe)
18import qualified GHC.Exts as GHC
20import qualified GHC.Exts as GHC
19import qualified Streamly.Benchmark.Prelude as Ops
21import qualified Streamly.Benchmark.Prelude as Ops
@@ -46,15 +48,15 @@ instance NFData Ordering where rnf = (`seq` ())
46{-# INLINE benchIOSink #-}
48{-# INLINE benchIOSink #-}
47benchIOSink
49benchIOSink
48 :: (IsStream t, NFData b)
50 :: (IsStream t, NFData b)
49− => String -> (t IO Int -> IO b) -> Benchmark
51+ => Int -> String -> (t IO Int -> IO b) -> Benchmark
50−benchIOSink name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
52+benchIOSink value name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source value
52{-# INLINE benchHoistSink #-}
54{-# INLINE benchHoistSink #-}
53benchHoistSink
55benchHoistSink
54 :: (IsStream t, NFData b)
56 :: (IsStream t, NFData b)
55− => String -> (t Identity Int -> IO b) -> Benchmark
57+ => Int -> String -> (t Identity Int -> IO b) -> Benchmark
56−benchHoistSink name f =
58+benchHoistSink value name f =
57− bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.sourceUnfoldr
59+ bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.sourceUnfoldr value
59-- XXX once we convert all the functions to use this we can rename this to
61-- XXX once we convert all the functions to use this we can rename this to
60-- benchIOSink
62-- benchIOSink
@@ -67,8 +69,8 @@ benchIOSink1 name f = bench name $ nfIO $ randomRIO (1,1) >>= f
67{-# INLINE benchIdentitySink #-}
69{-# INLINE benchIdentitySink #-}
68benchIdentitySink
70benchIdentitySink
69 :: (IsStream t, NFData b)
71 :: (IsStream t, NFData b)
70− => String -> (t Identity Int -> Identity b) -> Benchmark
72+ => Int -> String -> (t Identity Int -> Identity b) -> Benchmark
71−benchIdentitySink name f = bench name $ nf (f . Ops.sourceUnfoldr) 1
73+benchIdentitySink value name f = bench name $ nf (f . Ops.sourceUnfoldr value) 1
73-- | Takes a source, and uses it with a default drain/fold method.
75-- | Takes a source, and uses it with a default drain/fold method.
74{-# INLINE benchIOSrc #-}
76{-# INLINE benchIOSrc #-}
@@ -89,8 +91,8 @@ benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
89benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
91benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
91{-# INLINE benchPureSink #-}
93{-# INLINE benchPureSink #-}
92−benchPureSink :: NFData b => String -> (SerialT Identity Int -> b) -> Benchmark
94+benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
93−benchPureSink name f = benchPure name Ops.sourceUnfoldr f
95+benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
95-- XXX once we convert all the functions to use this we can rename this to
97-- XXX once we convert all the functions to use this we can rename this to
96-- benchPureSink
98-- benchPureSink
@@ -102,369 +104,380 @@ benchPureSink1 name f =
102{-# INLINE benchPureSinkIO #-}
104{-# INLINE benchPureSinkIO #-}
103benchPureSinkIO
105benchPureSinkIO
104 :: NFData b
106 :: NFData b
105− => String -> (SerialT Identity Int -> IO b) -> Benchmark
107+ => Int -> String -> (SerialT Identity Int -> IO b) -> Benchmark
106−benchPureSinkIO name f =
108+benchPureSinkIO value name f =
107− bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr
109+ bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr value
109{-# INLINE benchPureSrc #-}
111{-# INLINE benchPureSrc #-}
110benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
112benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
111benchPureSrc name src = benchPure name src (runIdentity . S.drain)
113benchPureSrc name src = benchPure name src (runIdentity . S.drain)
113−mkString :: String
115+mkString :: Int -> String
114−mkString = "fromList [1" ++ concat (replicate Ops.value ",1") ++ "]"
116+mkString value = "fromList [1" ++ concat (replicate value ",1") ++ "]"
116−mkListString :: String
118+mkListString :: Int -> String
117−mkListString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
119+mkListString value = "[1" ++ concat (replicate value ",1") ++ "]"
119−mkList :: [Int]
121+mkList :: Int -> [Int]
120−mkList = [1..Ops.value]
122+mkList value = [1..value]
122main :: IO ()
124main :: IO ()
124− defaultMain
126+ -- Basement.Terminal.initialize required?
128+ let (value, args') = parseValue args
129+ (cfg, extra) = parseWith defaultConfig args'
130+ runMode (mode cfg) cfg extra
125 [ bgroup "serially"
131 [ bgroup "serially"
126 [ bgroup "pure"
132 [ bgroup "pure"
127− [ benchPureSink "id" id
133+ [ benchPureSink value "id" id
128− , benchPureSink1 "eqBy" Ops.eqByPure
134+ , benchPureSink1 "eqBy" (Ops.eqByPure value)
129− , benchPureSink "==" Ops.eqInstance
135+ , benchPureSink value "==" Ops.eqInstance
130− , benchPureSink "/=" Ops.eqInstanceNotEq
136+ , benchPureSink value "/=" Ops.eqInstanceNotEq
131− , benchPureSink1 "cmpBy" Ops.cmpByPure
137+ , benchPureSink1 "cmpBy" (Ops.cmpByPure value)
132− , benchPureSink "<" Ops.ordInstance
138+ , benchPureSink value "<" Ops.ordInstance
133− , benchPureSink "min" Ops.ordInstanceMin
139+ , benchPureSink value "min" Ops.ordInstanceMin
134− , benchPureSrc "IsList.fromList" Ops.sourceIsList
140+ , benchPureSrc "IsList.fromList" (Ops.sourceIsList value)
135 -- length is used to check for foldr/build fusion
141 -- length is used to check for foldr/build fusion
136− , benchPureSink "length . IsList.toList" (length . GHC.toList)
142+ , benchPureSink value "length . IsList.toList" (length . GHC.toList)
137− , benchPureSrc "IsString.fromString" Ops.sourceIsString
143+ , benchPureSrc "IsString.fromString" (Ops.sourceIsString value)
138− , mkString `deepseq` (bench "readsPrec pure streams" $
144+ , mkString value `deepseq` (bench "readsPrec pure streams" $
139− nf Ops.readInstance mkString)
145+ nf Ops.readInstance (mkString value))
140− , mkString `deepseq` (bench "readsPrec Haskell lists" $
146+ , mkString value `deepseq` (bench "readsPrec Haskell lists" $
141− nf Ops.readInstanceList mkListString)
147+ nf Ops.readInstanceList (mkListString value))
142− , benchPureSink "showsPrec pure streams" Ops.showInstance
148+ , benchPureSink value "showsPrec pure streams" Ops.showInstance
143− , mkList `deepseq` (bench "showPrec Haskell lists" $
149+ , mkList value `deepseq` (bench "showPrec Haskell lists" $
144− nf Ops.showInstanceList mkList)
150+ nf Ops.showInstanceList (mkList value))
145− , benchPureSink "foldl'" Ops.pureFoldl'
151+ , benchPureSink value "foldl'" Ops.pureFoldl'
146− , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
152+ , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
147− , benchPureSink "foldable/sum" Ops.foldableSum
153+ , benchPureSink value "foldable/sum" Ops.foldableSum
148− , benchPureSinkIO "traversable/mapM" Ops.traversableMapM
154+ , benchPureSinkIO value "traversable/mapM" Ops.traversableMapM
150 , bgroup "generation"
156 , bgroup "generation"
151 [ -- Most basic, barely stream continuations running
157 [ -- Most basic, barely stream continuations running
152− benchIOSrc serially "unfoldr" Ops.sourceUnfoldr
158+ benchIOSrc serially "unfoldr" (Ops.sourceUnfoldr value)
153− , benchIOSrc serially "unfoldrM" Ops.sourceUnfoldrM
159+ , benchIOSrc serially "unfoldrM" (Ops.sourceUnfoldrM value)
154− , benchIOSrc serially "intFromTo" Ops.sourceIntFromTo
160+ , benchIOSrc serially "intFromTo" (Ops.sourceIntFromTo value)
155− , benchIOSrc serially "intFromThenTo" Ops.sourceIntFromThenTo
161+ , benchIOSrc serially "intFromThenTo" (Ops.sourceIntFromThenTo value)
156− , benchIOSrc serially "integerFromStep" Ops.sourceIntegerFromStep
162+ , benchIOSrc serially "integerFromStep" (Ops.sourceIntegerFromStep value)
157− , benchIOSrc serially "fracFromThenTo" Ops.sourceFracFromThenTo
163+ , benchIOSrc serially "fracFromThenTo" (Ops.sourceFracFromThenTo value)
158− , benchIOSrc serially "fracFromTo" Ops.sourceFracFromTo
164+ , benchIOSrc serially "fracFromTo" (Ops.sourceFracFromTo value)
159− , benchIOSrc serially "fromList" Ops.sourceFromList
165+ , benchIOSrc serially "fromList" (Ops.sourceFromList value)
160− , benchIOSrc serially "fromListM" Ops.sourceFromListM
166+ , benchIOSrc serially "fromListM" (Ops.sourceFromListM value)
161 -- These are essentially cons and consM
167 -- These are essentially cons and consM
162− , benchIOSrc serially "fromFoldable" Ops.sourceFromFoldable
168+ , benchIOSrc serially "fromFoldable" (Ops.sourceFromFoldable value)
163− , benchIOSrc serially "fromFoldableM" Ops.sourceFromFoldableM
169+ , benchIOSrc serially "fromFoldableM" (Ops.sourceFromFoldableM value)
165 , bgroup "elimination"
171 , bgroup "elimination"
166 [ bgroup "reduce"
172 [ bgroup "reduce"
167 [ bgroup "IO"
173 [ bgroup "IO"
168− [ benchIOSink "foldrM" Ops.foldrMReduce
174+ [ benchIOSink value "foldrM" Ops.foldrMReduce
169− , benchIOSink "foldl'" Ops.foldl'Reduce
175+ , benchIOSink value "foldl'" Ops.foldl'Reduce
170− , benchIOSink "foldl1'" Ops.foldl1'Reduce
176+ , benchIOSink value "foldl1'" Ops.foldl1'Reduce
171− , benchIOSink "foldlM'" Ops.foldlM'Reduce
177+ , benchIOSink value "foldlM'" Ops.foldlM'Reduce
173 , bgroup "Identity"
179 , bgroup "Identity"
174− [ benchIdentitySink "foldrM" Ops.foldrMReduce
180+ [ benchIdentitySink value "foldrM" Ops.foldrMReduce
175− , benchIdentitySink "foldl'" Ops.foldl'Reduce
181+ , benchIdentitySink value "foldl'" Ops.foldl'Reduce
176− , benchIdentitySink "foldl1'" Ops.foldl1'Reduce
182+ , benchIdentitySink value "foldl1'" Ops.foldl1'Reduce
177− , benchIdentitySink "foldlM'" Ops.foldlM'Reduce
183+ , benchIdentitySink value "foldlM'" Ops.foldlM'Reduce
181 , bgroup "build"
187 , bgroup "build"
182 [ bgroup "IO"
188 [ bgroup "IO"
183− [ benchIOSink "foldrM" Ops.foldrMBuild
189+ [ benchIOSink value "foldrM" Ops.foldrMBuild
184− , benchIOSink "foldl'" Ops.foldl'Build
190+ , benchIOSink value "foldl'" Ops.foldl'Build
185− , benchIOSink "foldlM'" Ops.foldlM'Build
191+ , benchIOSink value "foldlM'" Ops.foldlM'Build
187 , bgroup "Identity"
193 , bgroup "Identity"
188− [ benchIdentitySink "foldrM" Ops.foldrMBuild
194+ [ benchIdentitySink value "foldrM" Ops.foldrMBuild
189− , benchIdentitySink "foldl'" Ops.foldl'Build
195+ , benchIdentitySink value "foldl'" Ops.foldl'Build
190− , benchIdentitySink "foldlM'" Ops.foldlM'Build
196+ , benchIdentitySink value "foldlM'" Ops.foldlM'Build
193− , benchIOSink "uncons" Ops.uncons
199+ , benchIOSink value "uncons" Ops.uncons
194− , benchIOSink "toNull" $ Ops.toNull serially
200+ , benchIOSink value "toNull" $ Ops.toNull serially
195− , benchIOSink "mapM_" Ops.mapM_
201+ , benchIOSink value "mapM_" Ops.mapM_
197− , benchIOSink "init" Ops.init
203+ , benchIOSink value "init" Ops.init
198− , benchIOSink "tail" Ops.tail
204+ , benchIOSink value "tail" Ops.tail
199− , benchIOSink "nullHeadTail" Ops.nullHeadTail
205+ , benchIOSink value "nullHeadTail" Ops.nullHeadTail
201 -- this is too low and causes all benchmarks reported in ns
207 -- this is too low and causes all benchmarks reported in ns
202− -- , benchIOSink "head" Ops.head
208+ -- , benchIOSink value "head" Ops.head
203− , benchIOSink "last" Ops.last
209+ , benchIOSink value "last" Ops.last
204− -- , benchIOSink "lookup" Ops.lookup
210+ -- , benchIOSink value "lookup" Ops.lookup
205− , benchIOSink "find" Ops.find
211+ , benchIOSink value "find" (Ops.find value)
206− , benchIOSink "findIndex" Ops.findIndex
212+ , benchIOSink value "findIndex" (Ops.findIndex value)
207− , benchIOSink "elemIndex" Ops.elemIndex
213+ , benchIOSink value "elemIndex" (Ops.elemIndex value)
209 -- this is too low and causes all benchmarks reported in ns
215 -- this is too low and causes all benchmarks reported in ns
210− -- , benchIOSink "null" Ops.null
216+ -- , benchIOSink value "null" Ops.null
211− , benchIOSink "elem" Ops.elem
217+ , benchIOSink value "elem" (Ops.elem value)
212− , benchIOSink "notElem" Ops.notElem
218+ , benchIOSink value "notElem" (Ops.notElem value)
213− , benchIOSink "all" Ops.all
219+ , benchIOSink value "all" (Ops.all value)
214− , benchIOSink "any" Ops.any
220+ , benchIOSink value "any" (Ops.any value)
215− , benchIOSink "and" Ops.and
221+ , benchIOSink value "and" (Ops.and value)
216− , benchIOSink "or" Ops.or
222+ , benchIOSink value "or" (Ops.or value)
218− , benchIOSink "length" Ops.length
224+ , benchIOSink value "length" Ops.length
219− , benchHoistSink "length . generally" (Ops.length . IP.generally)
225+ , benchHoistSink value "length . generally" (Ops.length . IP.generally)
220− , benchIOSink "sum" Ops.sum
226+ , benchIOSink value "sum" Ops.sum
221− , benchIOSink "product" Ops.product
227+ , benchIOSink value "product" Ops.product
223− , benchIOSink "maximumBy" Ops.maximumBy
229+ , benchIOSink value "maximumBy" Ops.maximumBy
224− , benchIOSink "maximum" Ops.maximum
230+ , benchIOSink value "maximum" Ops.maximum
225− , benchIOSink "minimumBy" Ops.minimumBy
231+ , benchIOSink value "minimumBy" Ops.minimumBy
226− , benchIOSink "minimum" Ops.minimum
232+ , benchIOSink value "minimum" Ops.minimum
228− , benchIOSink "toList" Ops.toList
234+ , benchIOSink value "toList" Ops.toList
229− , benchIOSink "toListRev" Ops.toListRev
235+ , benchIOSink value "toListRev" Ops.toListRev
231 , bgroup "folds"
237 , bgroup "folds"
232− [ benchIOSink "drain" (S.fold FL.drain)
238+ [ benchIOSink value "drain" (S.fold FL.drain)
233− , benchIOSink "drainN" (S.fold (IFL.drainN Ops.value))
239+ , benchIOSink value "drainN" (S.fold (IFL.drainN value))
234− , benchIOSink "drainWhileTrue" (S.fold (IFL.drainWhile $ (<=) Ops.maxValue))
240+ , benchIOSink value "drainWhileTrue" (S.fold (IFL.drainWhile $ (<=) (value + 1)))
235− , benchIOSink "drainWhileFalse" (S.fold (IFL.drainWhile $ (>=) Ops.maxValue))
241+ , benchIOSink value "drainWhileFalse" (S.fold (IFL.drainWhile $ (>=) (value + 1)))
236− , benchIOSink "sink" (S.fold $ Sink.toFold Sink.drain)
242+ , benchIOSink value "sink" (S.fold $ Sink.toFold Sink.drain)
237− , benchIOSink "last" (S.fold FL.last)
243+ , benchIOSink value "last" (S.fold FL.last)
238− , benchIOSink "lastN.1" (S.fold (IA.lastN 1))
244+ , benchIOSink value "lastN.1" (S.fold (IA.lastN 1))
239− , benchIOSink "lastN.10" (S.fold (IA.lastN 10))
245+ , benchIOSink value "lastN.10" (S.fold (IA.lastN 10))
240− , benchIOSink "lastN.Max" (S.fold (IA.lastN Ops.maxValue))
246+ , benchIOSink value "lastN.Max" (S.fold (IA.lastN (value + 1)))
241− , benchIOSink "length" (S.fold FL.length)
247+ , benchIOSink value "length" (S.fold FL.length)
242− , benchIOSink "sum" (S.fold FL.sum)
248+ , benchIOSink value "sum" (S.fold FL.sum)
243− , benchIOSink "product" (S.fold FL.product)
249+ , benchIOSink value "product" (S.fold FL.product)
244− , benchIOSink "maximumBy" (S.fold (FL.maximumBy compare))
250+ , benchIOSink value "maximumBy" (S.fold (FL.maximumBy compare))
245− , benchIOSink "maximum" (S.fold FL.maximum)
251+ , benchIOSink value "maximum" (S.fold FL.maximum)
246− , benchIOSink "minimumBy" (S.fold (FL.minimumBy compare))
252+ , benchIOSink value "minimumBy" (S.fold (FL.minimumBy compare))
247− , benchIOSink "minimum" (S.fold FL.minimum)
253+ , benchIOSink value "minimum" (S.fold FL.minimum)
248− , benchIOSink "mean" (\s -> S.fold FL.mean (S.map (fromIntegral :: Int -> Double) s))
254+ , benchIOSink value "mean" (\s -> S.fold FL.mean (S.map (fromIntegral :: Int -> Double) s))
249− , benchIOSink "variance" (\s -> S.fold FL.variance (S.map (fromIntegral :: Int -> Double) s))
255+ , benchIOSink value "variance" (\s -> S.fold FL.variance (S.map (fromIntegral :: Int -> Double) s))
250− , benchIOSink "stdDev" (\s -> S.fold FL.stdDev (S.map (fromIntegral :: Int -> Double) s))
256+ , benchIOSink value "stdDev" (\s -> S.fold FL.stdDev (S.map (fromIntegral :: Int -> Double) s))
252− , benchIOSink "mconcat" (S.fold FL.mconcat . (S.map (Last . Just)))
258+ , benchIOSink value "mconcat" (S.fold FL.mconcat . (S.map (Last . Just)))
253− , benchIOSink "foldMap" (S.fold (FL.foldMap (Last . Just)))
259+ , benchIOSink value "foldMap" (S.fold (FL.foldMap (Last . Just)))
255− , benchIOSink "toList" (S.fold FL.toList)
261+ , benchIOSink value "toList" (S.fold FL.toList)
256− , benchIOSink "toListRevF" (S.fold IFL.toListRevF)
262+ , benchIOSink value "toListRevF" (S.fold IFL.toListRevF)
257− , benchIOSink "toStream" (S.fold IP.toStream)
263+ , benchIOSink value "toStream" (S.fold IP.toStream)
258− , benchIOSink "toStreamRev" (S.fold IP.toStreamRev)
264+ , benchIOSink value "toStreamRev" (S.fold IP.toStreamRev)
259− , benchIOSink "writeN" (S.fold (A.writeN Ops.value))
265+ , benchIOSink value "writeN" (S.fold (A.writeN value))
261− , benchIOSink "index" (S.fold (FL.index Ops.maxValue))
267+ , benchIOSink value "index" (S.fold (FL.index (value + 1)))
262− , benchIOSink "head" (S.fold FL.head)
268+ , benchIOSink value "head" (S.fold FL.head)
263− , benchIOSink "find" (S.fold (FL.find (== Ops.maxValue)))
269+ , benchIOSink value "find" (S.fold (FL.find (== (value + 1))))
264− , benchIOSink "findIndex" (S.fold (FL.findIndex (== Ops.maxValue)))
270+ , benchIOSink value "findIndex" (S.fold (FL.findIndex (== (value + 1))))
265− , benchIOSink "elemIndex" (S.fold (FL.elemIndex Ops.maxValue))
271+ , benchIOSink value "elemIndex" (S.fold (FL.elemIndex (value + 1)))
267− , benchIOSink "null" (S.fold FL.null)
273+ , benchIOSink value "null" (S.fold FL.null)
268− , benchIOSink "elem" (S.fold (FL.elem Ops.maxValue))
274+ , benchIOSink value "elem" (S.fold (FL.elem (value + 1)))
269− , benchIOSink "notElem" (S.fold (FL.notElem Ops.maxValue))
275+ , benchIOSink value "notElem" (S.fold (FL.notElem (value + 1)))
270− , benchIOSink "all" (S.fold (FL.all (<= Ops.maxValue)))
276+ , benchIOSink value "all" (S.fold (FL.all (<= (value + 1))))
271− , benchIOSink "any" (S.fold (FL.any (> Ops.maxValue)))
277+ , benchIOSink value "any" (S.fold (FL.any (> (value + 1))))
272− , benchIOSink "and" (\s -> S.fold FL.and (S.map (<= Ops.maxValue) s))
278+ , benchIOSink value "and" (\s -> S.fold FL.and (S.map (<= (value + 1)) s))
273− , benchIOSink "or" (\s -> S.fold FL.or (S.map (> Ops.maxValue) s))
279+ , benchIOSink value "or" (\s -> S.fold FL.or (S.map (> (value + 1)) s))
275 , bgroup "fold-multi-stream"
281 , bgroup "fold-multi-stream"
276− [ benchIOSink1 "eqBy" Ops.eqBy
282+ [ benchIOSink1 "eqBy" (Ops.eqBy value)
277− , benchIOSink1 "cmpBy" Ops.cmpBy
283+ , benchIOSink1 "cmpBy" (Ops.cmpBy value)
278− , benchIOSink "isPrefixOf" Ops.isPrefixOf
284+ , benchIOSink value "isPrefixOf" Ops.isPrefixOf
279− , benchIOSink "isSubsequenceOf" Ops.isSubsequenceOf
285+ , benchIOSink value "isSubsequenceOf" Ops.isSubsequenceOf
280− , benchIOSink "stripPrefix" Ops.stripPrefix
286+ , benchIOSink value "stripPrefix" Ops.stripPrefix
282 , bgroup "folds-transforms"
288 , bgroup "folds-transforms"
283− [ benchIOSink "drain" (S.fold FL.drain)
289+ [ benchIOSink value "drain" (S.fold FL.drain)
284− , benchIOSink "lmap" (S.fold (IFL.lmap (+1) FL.drain))
290+ , benchIOSink value "lmap" (S.fold (IFL.lmap (+1) FL.drain))
285− , benchIOSink "pipe-mapM"
291+ , benchIOSink value "pipe-mapM"
286 (S.fold (IFL.transform (Pipe.mapM (\x -> return $ x + 1)) FL.drain))
292 (S.fold (IFL.transform (Pipe.mapM (\x -> return $ x + 1)) FL.drain))
288 , bgroup "folds-compositions" -- Applicative
294 , bgroup "folds-compositions" -- Applicative
290− benchIOSink "all,any" (S.fold ((,) <$> FL.all (<= Ops.maxValue)
296+ benchIOSink value "all,any" (S.fold ((,) <$> FL.all (<= (value + 1))
291− <*> FL.any (> Ops.maxValue)))
297+ <*> FL.any (> (value + 1))))
292− , benchIOSink "sum,length" (S.fold ((,) <$> FL.sum <*> FL.length))
298+ , benchIOSink value "sum,length" (S.fold ((,) <$> FL.sum <*> FL.length))
294 , bgroup "pipes"
300 , bgroup "pipes"
295− [ benchIOSink "mapM" (Ops.transformMapM serially 1)
301+ [ benchIOSink value "mapM" (Ops.transformMapM serially 1)
296− , benchIOSink "compose" (Ops.transformComposeMapM serially 1)
302+ , benchIOSink value "compose" (Ops.transformComposeMapM serially 1)
297− , benchIOSink "tee" (Ops.transformTeeMapM serially 1)
303+ , benchIOSink value "tee" (Ops.transformTeeMapM serially 1)
298− , benchIOSink "zip" (Ops.transformZipMapM serially 1)
304+ , benchIOSink value "zip" (Ops.transformZipMapM serially 1)
300 , bgroup "pipesX4"
306 , bgroup "pipesX4"
301− [ benchIOSink "mapM" (Ops.transformMapM serially 4)
307+ [ benchIOSink value "mapM" (Ops.transformMapM serially 4)
302− , benchIOSink "compose" (Ops.transformComposeMapM serially 4)
308+ , benchIOSink value "compose" (Ops.transformComposeMapM serially 4)
303− , benchIOSink "tee" (Ops.transformTeeMapM serially 4)
309+ , benchIOSink value "tee" (Ops.transformTeeMapM serially 4)
304− , benchIOSink "zip" (Ops.transformZipMapM serially 4)
310+ , benchIOSink value "zip" (Ops.transformZipMapM serially 4)
306 , bgroup "transformer"
312 , bgroup "transformer"
307− [ benchIOSrc serially "evalState" Ops.evalStateT
313+ [ benchIOSrc serially "evalState" (Ops.evalStateT value)
308− , benchIOSrc serially "withState" Ops.withState
314+ , benchIOSrc serially "withState" (Ops.withState value)
310 , bgroup "transformation"
316 , bgroup "transformation"
311− [ benchIOSink "scanl" (Ops.scan 1)
317+ [ benchIOSink value "scanl" (Ops.scan 1)
312− , benchIOSink "scanl1'" (Ops.scanl1' 1)
318+ , benchIOSink value "scanl1'" (Ops.scanl1' 1)
313− , benchIOSink "map" (Ops.map 1)
319+ , benchIOSink value "map" (Ops.map 1)
314− , benchIOSink "fmap" (Ops.fmap 1)
320+ , benchIOSink value "fmap" (Ops.fmap 1)
315− , benchIOSink "mapM" (Ops.mapM serially 1)
321+ , benchIOSink value "mapM" (Ops.mapM serially 1)
316− , benchIOSink "mapMaybe" (Ops.mapMaybe 1)
322+ , benchIOSink value "mapMaybe" (Ops.mapMaybe 1)
317− , benchIOSink "mapMaybeM" (Ops.mapMaybeM 1)
323+ , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 1)
318 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
324 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
319− Ops.sequence serially (Ops.sourceUnfoldrMAction n)
325+ Ops.sequence serially (Ops.sourceUnfoldrMAction value n)
320− , benchIOSink "findIndices" (Ops.findIndices 1)
326+ , benchIOSink value "findIndices" (Ops.findIndices value 1)
321− , benchIOSink "elemIndices" (Ops.elemIndices 1)
327+ , benchIOSink value "elemIndices" (Ops.elemIndices value 1)
322− , benchIOSink "reverse" (Ops.reverse 1)
328+ , benchIOSink value "reverse" (Ops.reverse 1)
323− , benchIOSink "reverse'" (Ops.reverse' 1)
329+ , benchIOSink value "reverse'" (Ops.reverse' 1)
324− , benchIOSink "foldrS" (Ops.foldrS 1)
330+ , benchIOSink value "foldrS" (Ops.foldrS 1)
325− , benchIOSink "foldrSMap" (Ops.foldrSMap 1)
331+ , benchIOSink value "foldrSMap" (Ops.foldrSMap 1)
326− , benchIOSink "foldrT" (Ops.foldrT 1)
332+ , benchIOSink value "foldrT" (Ops.foldrT 1)
327− , benchIOSink "foldrTMap" (Ops.foldrTMap 1)
333+ , benchIOSink value "foldrTMap" (Ops.foldrTMap 1)
328− , benchIOSink "tap" (Ops.tap 1)
334+ , benchIOSink value "tap" (Ops.tap 1)
329− , benchIOSink "tapRate 1 second" (Ops.tapRate 1)
335+ , benchIOSink value "tapRate 1 second" (Ops.tapRate 1)
330− , benchIOSink "pollCounts 1 second" (Ops.pollCounts 1)
336+ , benchIOSink value "pollCounts 1 second" (Ops.pollCounts 1)
331− , benchIOSink "tapAsync" (Ops.tapAsync 1)
337+ , benchIOSink value "tapAsync" (Ops.tapAsync 1)
332− , benchIOSink "tapAsyncS" (Ops.tapAsyncS 1)
338+ , benchIOSink value "tapAsyncS" (Ops.tapAsyncS 1)
334 , bgroup "transformationX4"
340 , bgroup "transformationX4"
335− [ benchIOSink "scan" (Ops.scan 4)
341+ [ benchIOSink value "scan" (Ops.scan 4)
336− , benchIOSink "scanl1'" (Ops.scanl1' 4)
342+ , benchIOSink value "scanl1'" (Ops.scanl1' 4)
337− , benchIOSink "map" (Ops.map 4)
343+ , benchIOSink value "map" (Ops.map 4)
338− , benchIOSink "fmap" (Ops.fmap 4)
344+ , benchIOSink value "fmap" (Ops.fmap 4)
339− , benchIOSink "mapM" (Ops.mapM serially 4)
345+ , benchIOSink value "mapM" (Ops.mapM serially 4)
340− , benchIOSink "mapMaybe" (Ops.mapMaybe 4)
346+ , benchIOSink value "mapMaybe" (Ops.mapMaybe 4)
341− , benchIOSink "mapMaybeM" (Ops.mapMaybeM 4)
347+ , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 4)
342 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
348 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
343 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
349 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
344− , benchIOSink "findIndices" (Ops.findIndices 4)
350+ , benchIOSink value "findIndices" (Ops.findIndices value 4)
345− , benchIOSink "elemIndices" (Ops.elemIndices 4)
351+ , benchIOSink value "elemIndices" (Ops.elemIndices value 4)
347 , bgroup "filtering"
353 , bgroup "filtering"
348− [ benchIOSink "filter-even" (Ops.filterEven 1)
354+ [ benchIOSink value "filter-even" (Ops.filterEven 1)
349− , benchIOSink "filter-all-out" (Ops.filterAllOut 1)
355+ , benchIOSink value "filter-all-out" (Ops.filterAllOut value 1)
350− , benchIOSink "filter-all-in" (Ops.filterAllIn 1)
356+ , benchIOSink value "filter-all-in" (Ops.filterAllIn value 1)
351− , benchIOSink "take-all" (Ops.takeAll 1)
357+ , benchIOSink value "take-all" (Ops.takeAll value 1)
352− , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 1)
358+ , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 1)
353− --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
359+ --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 1)
354− , benchIOSink "drop-one" (Ops.dropOne 1)
360+ , benchIOSink value "drop-one" (Ops.dropOne 1)
355− , benchIOSink "drop-all" (Ops.dropAll 1)
361+ , benchIOSink value "drop-all" (Ops.dropAll value 1)
356− , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 1)
362+ , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 1)
357− --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
363+ --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 1)
358− , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 1)
364+ , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 1)
359− , benchIOSink "deleteBy" (Ops.deleteBy 1)
365+ , benchIOSink value "deleteBy" (Ops.deleteBy value 1)
360− , benchIOSink "intersperse" (Ops.intersperse 1)
366+ , benchIOSink value "intersperse" (Ops.intersperse value 1)
361− , benchIOSink "insertBy" (Ops.insertBy 1)
367+ , benchIOSink value "insertBy" (Ops.insertBy value 1)
363 , bgroup "filteringX4"
369 , bgroup "filteringX4"
364− [ benchIOSink "filter-even" (Ops.filterEven 4)
370+ [ benchIOSink value "filter-even" (Ops.filterEven 4)
365− , benchIOSink "filter-all-out" (Ops.filterAllOut 4)
371+ , benchIOSink value "filter-all-out" (Ops.filterAllOut value 4)
366− , benchIOSink "filter-all-in" (Ops.filterAllIn 4)
372+ , benchIOSink value "filter-all-in" (Ops.filterAllIn value 4)
367− , benchIOSink "take-all" (Ops.takeAll 4)
373+ , benchIOSink value "take-all" (Ops.takeAll value 4)
368− , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 4)
374+ , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 4)
369− --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
375+ --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 4)
370− , benchIOSink "drop-one" (Ops.dropOne 4)
376+ , benchIOSink value "drop-one" (Ops.dropOne 4)
371− , benchIOSink "drop-all" (Ops.dropAll 4)
377+ , benchIOSink value "drop-all" (Ops.dropAll value 4)
372− , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 4)
378+ , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 4)
373− --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
379+ --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 4)
374− , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 4)
380+ , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 4)
375− , benchIOSink "deleteBy" (Ops.deleteBy 4)
381+ , benchIOSink value "deleteBy" (Ops.deleteBy value 4)
376− , benchIOSink "intersperse" (Ops.intersperse 4)
382+ , benchIOSink value "intersperse" (Ops.intersperse value 4)
377− , benchIOSink "insertBy" (Ops.insertBy 4)
383+ , benchIOSink value "insertBy" (Ops.insertBy value 4)
379 , bgroup "joining"
385 , bgroup "joining"
380− [ benchIOSrc1 "zip (2,x/2)" (Ops.zip (Ops.value `div` 2))
386+ [ benchIOSrc1 "zip (2,x/2)" (Ops.zip (value `div` 2))
381− , benchIOSrc1 "zipM (2,x/2)" (Ops.zipM (Ops.value `div` 2))
387+ , benchIOSrc1 "zipM (2,x/2)" (Ops.zipM (value `div` 2))
382− , benchIOSrc1 "mergeBy (2,x/2)" (Ops.mergeBy (Ops.value `div` 2))
388+ , benchIOSrc1 "mergeBy (2,x/2)" (Ops.mergeBy (value `div` 2))
383− , benchIOSrc1 "serial (2,x/2)" (Ops.serial2 (Ops.value `div` 2))
389+ , benchIOSrc1 "serial (2,x/2)" (Ops.serial2 (value `div` 2))
384− , benchIOSrc1 "append (2,x/2)" (Ops.append2 (Ops.value `div` 2))
390+ , benchIOSrc1 "append (2,x/2)" (Ops.append2 (value `div` 2))
385− , benchIOSrc1 "serial (2,2,x/4)" (Ops.serial4 (Ops.value `div` 4))
391+ , benchIOSrc1 "serial (2,2,x/4)" (Ops.serial4 (value `div` 4))
386− , benchIOSrc1 "append (2,2,x/4)" (Ops.append4 (Ops.value `div` 4))
392+ , benchIOSrc1 "append (2,2,x/4)" (Ops.append4 (value `div` 4))
387− , benchIOSrc1 "wSerial (2,x/2)" Ops.wSerial2
393+ , benchIOSrc1 "wSerial (2,x/2)" (Ops.wSerial2 value)
388− , benchIOSrc1 "interleave (2,x/2)" Ops.interleave2
394+ , benchIOSrc1 "interleave (2,x/2)" (Ops.interleave2 value)
389− , benchIOSrc1 "roundRobin (2,x/2)" Ops.roundRobin2
395+ , benchIOSrc1 "roundRobin (2,x/2)" (Ops.roundRobin2 value)
391 , bgroup "concat-foldable"
397 , bgroup "concat-foldable"
392− [ benchIOSrc serially "foldMapWith" Ops.sourceFoldMapWith
398+ [ benchIOSrc serially "foldMapWith" (Ops.sourceFoldMapWith value)
393− , benchIOSrc serially "foldMapWithM" Ops.sourceFoldMapWithM
399+ , benchIOSrc serially "foldMapWithM" (Ops.sourceFoldMapWithM value)
394− , benchIOSrc serially "foldMapM" Ops.sourceFoldMapM
400+ , benchIOSrc serially "foldMapM" (Ops.sourceFoldMapM value)
395− , benchIOSrc serially "foldWithConcatMapId" Ops.sourceConcatMapId
401+ , benchIOSrc serially "foldWithConcatMapId" (Ops.sourceConcatMapId value)
397 , bgroup "concat-serial"
403 , bgroup "concat-serial"
398− [ benchIOSrc1 "concatMapPure (2,x/2)" (Ops.concatMapPure 2 (Ops.value `div` 2))
404+ [ benchIOSrc1 "concatMapPure (2,x/2)" (Ops.concatMapPure 2 (value `div` 2))
399− , benchIOSrc1 "concatMap (2,x/2)" (Ops.concatMap 2 (Ops.value `div` 2))
405+ , benchIOSrc1 "concatMap (2,x/2)" (Ops.concatMap 2 (value `div` 2))
400− , benchIOSrc1 "concatMap (x/2,2)" (Ops.concatMap (Ops.value `div` 2) 2)
406+ , benchIOSrc1 "concatMap (x/2,2)" (Ops.concatMap (value `div` 2) 2)
401− , benchIOSrc1 "concatMapRepl (x/4,4)" Ops.concatMapRepl4xN
407+ , benchIOSrc1 "concatMapRepl (x/4,4)" (Ops.concatMapRepl4xN value)
402− , benchIOSrc1 "concatUnfoldRepl (x/4,4)" Ops.concatUnfoldRepl4xN
408+ , benchIOSrc1 "concatUnfoldRepl (x/4,4)" (Ops.concatUnfoldRepl4xN value)
404 , benchIOSrc1 "concatMapWithSerial (2,x/2)"
410 , benchIOSrc1 "concatMapWithSerial (2,x/2)"
405− (Ops.concatMapWithSerial 2 (Ops.value `div` 2))
411+ (Ops.concatMapWithSerial 2 (value `div` 2))
406 , benchIOSrc1 "concatMapWithSerial (x/2,2)"
412 , benchIOSrc1 "concatMapWithSerial (x/2,2)"
407− (Ops.concatMapWithSerial (Ops.value `div` 2) 2)
413+ (Ops.concatMapWithSerial (value `div` 2) 2)
409 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
415 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
410− (Ops.concatMapWithAppend 2 (Ops.value `div` 2))
416+ (Ops.concatMapWithAppend 2 (value `div` 2))
412 , bgroup "concat-interleave"
418 , bgroup "concat-interleave"
413 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
419 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
414− (Ops.concatMapWithWSerial 2 (Ops.value `div` 2))
420+ (Ops.concatMapWithWSerial 2 (value `div` 2))
415 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
421 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
416− (Ops.concatMapWithWSerial (Ops.value `div` 2) 2)
422+ (Ops.concatMapWithWSerial (value `div` 2) 2)
417 , benchIOSrc1 "concatUnfoldInterleaveRepl (x/4,4)"
423 , benchIOSrc1 "concatUnfoldInterleaveRepl (x/4,4)"
418− Ops.concatUnfoldInterleaveRepl4xN
424+ (Ops.concatUnfoldInterleaveRepl4xN value)
419 , benchIOSrc1 "concatUnfoldRoundrobinRepl (x/4,4)"
425 , benchIOSrc1 "concatUnfoldRoundrobinRepl (x/4,4)"
420− Ops.concatUnfoldRoundrobinRepl4xN
426+ (Ops.concatUnfoldRoundrobinRepl4xN value)
422 -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
428 -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
423 -- library. If scan/fold followed by a map is efficient enough we may not
429 -- library. If scan/fold followed by a map is efficient enough we may not
424 -- need monolithic implementations of these.
430 -- need monolithic implementations of these.
425 , bgroup "mixed"
431 , bgroup "mixed"
426− [ benchIOSink "scanl-map" (Ops.scanMap 1)
432+ [ benchIOSink value "scanl-map" (Ops.scanMap 1)
427− , benchIOSink "foldl-map" Ops.foldl'ReduceMap
433+ , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
428− , benchIOSink "sum-product-fold" Ops.sumProductFold
434+ , benchIOSink value "sum-product-fold" Ops.sumProductFold
429− , benchIOSink "sum-product-scan" Ops.sumProductScan
435+ , benchIOSink value "sum-product-scan" Ops.sumProductScan
431 , bgroup "mixedX4"
437 , bgroup "mixedX4"
432− [ benchIOSink "scan-map" (Ops.scanMap 4)
438+ [ benchIOSink value "scan-map" (Ops.scanMap 4)
433− , benchIOSink "drop-map" (Ops.dropMap 4)
439+ , benchIOSink value "drop-map" (Ops.dropMap 4)
434− , benchIOSink "drop-scan" (Ops.dropScan 4)
440+ , benchIOSink value "drop-scan" (Ops.dropScan 4)
435− , benchIOSink "take-drop" (Ops.takeDrop 4)
441+ , benchIOSink value "take-drop" (Ops.takeDrop value 4)
436− , benchIOSink "take-scan" (Ops.takeScan 4)
442+ , benchIOSink value "take-scan" (Ops.takeScan value 4)
437− , benchIOSink "take-map" (Ops.takeMap 4)
443+ , benchIOSink value "take-map" (Ops.takeMap value 4)
438− , benchIOSink "filter-drop" (Ops.filterDrop 4)
444+ , benchIOSink value "filter-drop" (Ops.filterDrop value 4)
439− , benchIOSink "filter-take" (Ops.filterTake 4)
445+ , benchIOSink value "filter-take" (Ops.filterTake value 4)
440− , benchIOSink "filter-scan" (Ops.filterScan 4)
446+ , benchIOSink value "filter-scan" (Ops.filterScan 4)
441− , benchIOSink "filter-scanl1" (Ops.filterScanl1 4)
447+ , benchIOSink value "filter-scanl1" (Ops.filterScanl1 4)
442− , benchIOSink "filter-map" (Ops.filterMap 4)
448+ , benchIOSink value "filter-map" (Ops.filterMap value 4)
444 , bgroup "iterated"
450 , bgroup "iterated"
445 [ benchIOSrc serially "mapM" Ops.iterateMapM
451 [ benchIOSrc serially "mapM" Ops.iterateMapM
446 , benchIOSrc serially "scan(1/100)" Ops.iterateScan
452 , benchIOSrc serially "scan(1/100)" Ops.iterateScan
447 , benchIOSrc serially "scanl1(1/100)" Ops.iterateScanl1
453 , benchIOSrc serially "scanl1(1/100)" Ops.iterateScanl1
448 , benchIOSrc serially "filterEven" Ops.iterateFilterEven
454 , benchIOSrc serially "filterEven" Ops.iterateFilterEven
449− , benchIOSrc serially "takeAll" Ops.iterateTakeAll
455+ , benchIOSrc serially "takeAll" (Ops.iterateTakeAll value)
450 , benchIOSrc serially "dropOne" Ops.iterateDropOne
456 , benchIOSrc serially "dropOne" Ops.iterateDropOne
451− , benchIOSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
457+ , benchIOSrc serially "dropWhileFalse" (Ops.iterateDropWhileFalse value)
452− , benchIOSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
458+ , benchIOSrc serially "dropWhileTrue" (Ops.iterateDropWhileTrue value)
455 , bgroup "wSerially"
461 , bgroup "wSerially"
456 [ bgroup "transformation"
462 [ bgroup "transformation"
457− [ benchIOSink "fmap" $ Ops.fmap' wSerially 1
463+ [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
460 , bgroup "zipSerially"
466 , bgroup "zipSerially"
461 [ bgroup "transformation"
467 [ bgroup "transformation"
462− [ benchIOSink "fmap" $ Ops.fmap' zipSerially 1
468+ [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
465 , bgroup "zipAsyncly"
471 , bgroup "zipAsyncly"
466 [ bgroup "transformation"
472 [ bgroup "transformation"
467− [ benchIOSink "fmap" $ Ops.fmap' zipAsyncly 1
473+ [ benchIOSink value "fmap" $ Ops.fmap' zipAsyncly 1
478+ defaultValue = 100000
479+ parseValue [] = (defaultValue, [])
480+ parseValue a@(x:xs) =
481+ case (readMaybe x :: Maybe Int) of
482+ Just value -> (value, xs)
483+ Nothing -> (defaultValue, a)