@@ -14,6 +14,8 @@ import Control.DeepSeq (NFData(..), deepseq)
1414import Data.Functor.Identity (Identity, runIdentity)
1515import System.Random (randomRIO)
1616import Data.Monoid (Last(..))
17+import System.Environment (getArgs)
18+import Text.Read (readMaybe)
1719
1820import qualified GHC.Exts as GHC
1921import qualified Streamly.Benchmark.Prelude as Ops
@@ -46,15 +48,15 @@ instance NFData Ordering where rnf = (`seq` ())
4648{-# INLINE benchIOSink #-}
4749benchIOSink
4850 :: (IsStream t, NFData b)
49− => String -> (t IO Int -> IO b) -> Benchmark
50−benchIOSink name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
51+ => Int -> String -> (t IO Int -> IO b) -> Benchmark
52+benchIOSink value name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source value
5153
5254{-# INLINE benchHoistSink #-}
5355benchHoistSink
5456 :: (IsStream t, NFData b)
55− => String -> (t Identity Int -> IO b) -> Benchmark
56−benchHoistSink name f =
57− bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.sourceUnfoldr
57+ => Int -> String -> (t Identity Int -> IO b) -> Benchmark
58+benchHoistSink value name f =
59+ bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.sourceUnfoldr value
5860
5961-- XXX once we convert all the functions to use this we can rename this to
6062-- benchIOSink
@@ -67,8 +69,8 @@ benchIOSink1 name f = bench name $ nfIO $ randomRIO (1,1) >>= f
6769{-# INLINE benchIdentitySink #-}
6870benchIdentitySink
6971 :: (IsStream t, NFData b)
70− => String -> (t Identity Int -> Identity b) -> Benchmark
71−benchIdentitySink name f = bench name $ nf (f . Ops.sourceUnfoldr) 1
72+ => Int -> String -> (t Identity Int -> Identity b) -> Benchmark
73+benchIdentitySink value name f = bench name $ nf (f . Ops.sourceUnfoldr value) 1
7274
7375-- | Takes a source, and uses it with a default drain/fold method.
7476{-# INLINE benchIOSrc #-}
@@ -89,8 +91,8 @@ benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
8991benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
9092
9193{-# INLINE benchPureSink #-}
92−benchPureSink :: NFData b => String -> (SerialT Identity Int -> b) -> Benchmark
93−benchPureSink name f = benchPure name Ops.sourceUnfoldr f
94+benchPureSink :: NFData b => Int -> String -> (SerialT Identity Int -> b) -> Benchmark
95+benchPureSink value name f = benchPure name (Ops.sourceUnfoldr value) f
9496
9597-- XXX once we convert all the functions to use this we can rename this to
9698-- benchPureSink
@@ -102,369 +104,380 @@ benchPureSink1 name f =
102104{-# INLINE benchPureSinkIO #-}
103105benchPureSinkIO
104106 :: NFData b
105− => String -> (SerialT Identity Int -> IO b) -> Benchmark
106−benchPureSinkIO name f =
107− bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr
107+ => Int -> String -> (SerialT Identity Int -> IO b) -> Benchmark
108+benchPureSinkIO value name f =
109+ bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr value
108110
109111{-# INLINE benchPureSrc #-}
110112benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
111113benchPureSrc name src = benchPure name src (runIdentity . S.drain)
112114
113−mkString :: String
114−mkString = "fromList [1" ++ concat (replicate Ops.value ",1") ++ "]"
115+mkString :: Int -> String
116+mkString value = "fromList [1" ++ concat (replicate value ",1") ++ "]"
115117
116−mkListString :: String
117−mkListString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
118+mkListString :: Int -> String
119+mkListString value = "[1" ++ concat (replicate value ",1") ++ "]"
118120
119−mkList :: [Int]
120−mkList = [1..Ops.value]
121+mkList :: Int -> [Int]
122+mkList value = [1..value]
121123
122124main :: IO ()
123−main =
124− defaultMain
125+main = do
126+ -- Basement.Terminal.initialize required?
127+ args <- getArgs
128+ let (value, args') = parseValue args
129+ (cfg, extra) = parseWith defaultConfig args'
130+ runMode (mode cfg) cfg extra
125131 [ bgroup "serially"
126132 [ bgroup "pure"
127− [ benchPureSink "id" id
128− , benchPureSink1 "eqBy" Ops.eqByPure
129− , benchPureSink "==" Ops.eqInstance
130− , benchPureSink "/=" Ops.eqInstanceNotEq
131− , benchPureSink1 "cmpBy" Ops.cmpByPure
132− , benchPureSink "<" Ops.ordInstance
133− , benchPureSink "min" Ops.ordInstanceMin
134− , benchPureSrc "IsList.fromList" Ops.sourceIsList
133+ [ benchPureSink value "id" id
134+ , benchPureSink1 "eqBy" (Ops.eqByPure value)
135+ , benchPureSink value "==" Ops.eqInstance
136+ , benchPureSink value "/=" Ops.eqInstanceNotEq
137+ , benchPureSink1 "cmpBy" (Ops.cmpByPure value)
138+ , benchPureSink value "<" Ops.ordInstance
139+ , benchPureSink value "min" Ops.ordInstanceMin
140+ , benchPureSrc "IsList.fromList" (Ops.sourceIsList value)
135141 -- length is used to check for foldr/build fusion
136− , benchPureSink "length . IsList.toList" (length . GHC.toList)
137− , benchPureSrc "IsString.fromString" Ops.sourceIsString
138− , mkString `deepseq` (bench "readsPrec pure streams" $
139− nf Ops.readInstance mkString)
140− , mkString `deepseq` (bench "readsPrec Haskell lists" $
141− nf Ops.readInstanceList mkListString)
142− , benchPureSink "showsPrec pure streams" Ops.showInstance
143− , mkList `deepseq` (bench "showPrec Haskell lists" $
144− nf Ops.showInstanceList mkList)
145− , benchPureSink "foldl'" Ops.pureFoldl'
146− , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
147− , benchPureSink "foldable/sum" Ops.foldableSum
148− , benchPureSinkIO "traversable/mapM" Ops.traversableMapM
142+ , benchPureSink value "length . IsList.toList" (length . GHC.toList)
143+ , benchPureSrc "IsString.fromString" (Ops.sourceIsString value)
144+ , mkString value `deepseq` (bench "readsPrec pure streams" $
145+ nf Ops.readInstance (mkString value))
146+ , mkString value `deepseq` (bench "readsPrec Haskell lists" $
147+ nf Ops.readInstanceList (mkListString value))
148+ , benchPureSink value "showsPrec pure streams" Ops.showInstance
149+ , mkList value `deepseq` (bench "showPrec Haskell lists" $
150+ nf Ops.showInstanceList (mkList value))
151+ , benchPureSink value "foldl'" Ops.pureFoldl'
152+ , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
153+ , benchPureSink value "foldable/sum" Ops.foldableSum
154+ , benchPureSinkIO value "traversable/mapM" Ops.traversableMapM
149155 ]
150156 , bgroup "generation"
151157 [ -- Most basic, barely stream continuations running
152− benchIOSrc serially "unfoldr" Ops.sourceUnfoldr
153− , benchIOSrc serially "unfoldrM" Ops.sourceUnfoldrM
154− , benchIOSrc serially "intFromTo" Ops.sourceIntFromTo
155− , benchIOSrc serially "intFromThenTo" Ops.sourceIntFromThenTo
156− , benchIOSrc serially "integerFromStep" Ops.sourceIntegerFromStep
157− , benchIOSrc serially "fracFromThenTo" Ops.sourceFracFromThenTo
158− , benchIOSrc serially "fracFromTo" Ops.sourceFracFromTo
159− , benchIOSrc serially "fromList" Ops.sourceFromList
160− , benchIOSrc serially "fromListM" Ops.sourceFromListM
158+ benchIOSrc serially "unfoldr" (Ops.sourceUnfoldr value)
159+ , benchIOSrc serially "unfoldrM" (Ops.sourceUnfoldrM value)
160+ , benchIOSrc serially "intFromTo" (Ops.sourceIntFromTo value)
161+ , benchIOSrc serially "intFromThenTo" (Ops.sourceIntFromThenTo value)
162+ , benchIOSrc serially "integerFromStep" (Ops.sourceIntegerFromStep value)
163+ , benchIOSrc serially "fracFromThenTo" (Ops.sourceFracFromThenTo value)
164+ , benchIOSrc serially "fracFromTo" (Ops.sourceFracFromTo value)
165+ , benchIOSrc serially "fromList" (Ops.sourceFromList value)
166+ , benchIOSrc serially "fromListM" (Ops.sourceFromListM value)
161167 -- These are essentially cons and consM
162− , benchIOSrc serially "fromFoldable" Ops.sourceFromFoldable
163− , benchIOSrc serially "fromFoldableM" Ops.sourceFromFoldableM
168+ , benchIOSrc serially "fromFoldable" (Ops.sourceFromFoldable value)
169+ , benchIOSrc serially "fromFoldableM" (Ops.sourceFromFoldableM value)
164170 ]
165171 , bgroup "elimination"
166172 [ bgroup "reduce"
167173 [ bgroup "IO"
168− [ benchIOSink "foldrM" Ops.foldrMReduce
169− , benchIOSink "foldl'" Ops.foldl'Reduce
170− , benchIOSink "foldl1'" Ops.foldl1'Reduce
171− , benchIOSink "foldlM'" Ops.foldlM'Reduce
174+ [ benchIOSink value "foldrM" Ops.foldrMReduce
175+ , benchIOSink value "foldl'" Ops.foldl'Reduce
176+ , benchIOSink value "foldl1'" Ops.foldl1'Reduce
177+ , benchIOSink value "foldlM'" Ops.foldlM'Reduce
172178 ]
173179 , bgroup "Identity"
174− [ benchIdentitySink "foldrM" Ops.foldrMReduce
175− , benchIdentitySink "foldl'" Ops.foldl'Reduce
176− , benchIdentitySink "foldl1'" Ops.foldl1'Reduce
177− , benchIdentitySink "foldlM'" Ops.foldlM'Reduce
180+ [ benchIdentitySink value "foldrM" Ops.foldrMReduce
181+ , benchIdentitySink value "foldl'" Ops.foldl'Reduce
182+ , benchIdentitySink value "foldl1'" Ops.foldl1'Reduce
183+ , benchIdentitySink value "foldlM'" Ops.foldlM'Reduce
178184 ]
179185 ]
180186
181187 , bgroup "build"
182188 [ bgroup "IO"
183− [ benchIOSink "foldrM" Ops.foldrMBuild
184− , benchIOSink "foldl'" Ops.foldl'Build
185− , benchIOSink "foldlM'" Ops.foldlM'Build
189+ [ benchIOSink value "foldrM" Ops.foldrMBuild
190+ , benchIOSink value "foldl'" Ops.foldl'Build
191+ , benchIOSink value "foldlM'" Ops.foldlM'Build
186192 ]
187193 , bgroup "Identity"
188− [ benchIdentitySink "foldrM" Ops.foldrMBuild
189− , benchIdentitySink "foldl'" Ops.foldl'Build
190− , benchIdentitySink "foldlM'" Ops.foldlM'Build
194+ [ benchIdentitySink value "foldrM" Ops.foldrMBuild
195+ , benchIdentitySink value "foldl'" Ops.foldl'Build
196+ , benchIdentitySink value "foldlM'" Ops.foldlM'Build
191197 ]
192198 ]
193− , benchIOSink "uncons" Ops.uncons
194− , benchIOSink "toNull" $ Ops.toNull serially
195− , benchIOSink "mapM_" Ops.mapM_
199+ , benchIOSink value "uncons" Ops.uncons
200+ , benchIOSink value "toNull" $ Ops.toNull serially
201+ , benchIOSink value "mapM_" Ops.mapM_
196202
197− , benchIOSink "init" Ops.init
198− , benchIOSink "tail" Ops.tail
199− , benchIOSink "nullHeadTail" Ops.nullHeadTail
203+ , benchIOSink value "init" Ops.init
204+ , benchIOSink value "tail" Ops.tail
205+ , benchIOSink value "nullHeadTail" Ops.nullHeadTail
200206
201207 -- this is too low and causes all benchmarks reported in ns
202− -- , benchIOSink "head" Ops.head
203− , benchIOSink "last" Ops.last
204− -- , benchIOSink "lookup" Ops.lookup
205− , benchIOSink "find" Ops.find
206− , benchIOSink "findIndex" Ops.findIndex
207− , benchIOSink "elemIndex" Ops.elemIndex
208+ -- , benchIOSink value "head" Ops.head
209+ , benchIOSink value "last" Ops.last
210+ -- , benchIOSink value "lookup" Ops.lookup
211+ , benchIOSink value "find" (Ops.find value)
212+ , benchIOSink value "findIndex" (Ops.findIndex value)
213+ , benchIOSink value "elemIndex" (Ops.elemIndex value)
208214
209215 -- this is too low and causes all benchmarks reported in ns
210− -- , benchIOSink "null" Ops.null
211− , benchIOSink "elem" Ops.elem
212− , benchIOSink "notElem" Ops.notElem
213− , benchIOSink "all" Ops.all
214− , benchIOSink "any" Ops.any
215− , benchIOSink "and" Ops.and
216− , benchIOSink "or" Ops.or
217−
218− , benchIOSink "length" Ops.length
219− , benchHoistSink "length . generally" (Ops.length . IP.generally)
220− , benchIOSink "sum" Ops.sum
221− , benchIOSink "product" Ops.product
222−
223− , benchIOSink "maximumBy" Ops.maximumBy
224− , benchIOSink "maximum" Ops.maximum
225− , benchIOSink "minimumBy" Ops.minimumBy
226− , benchIOSink "minimum" Ops.minimum
227−
228− , benchIOSink "toList" Ops.toList
229− , benchIOSink "toListRev" Ops.toListRev
216+ -- , benchIOSink value "null" Ops.null
217+ , benchIOSink value "elem" (Ops.elem value)
218+ , benchIOSink value "notElem" (Ops.notElem value)
219+ , benchIOSink value "all" (Ops.all value)
220+ , benchIOSink value "any" (Ops.any value)
221+ , benchIOSink value "and" (Ops.and value)
222+ , benchIOSink value "or" (Ops.or value)
223+
224+ , benchIOSink value "length" Ops.length
225+ , benchHoistSink value "length . generally" (Ops.length . IP.generally)
226+ , benchIOSink value "sum" Ops.sum
227+ , benchIOSink value "product" Ops.product
228+
229+ , benchIOSink value "maximumBy" Ops.maximumBy
230+ , benchIOSink value "maximum" Ops.maximum
231+ , benchIOSink value "minimumBy" Ops.minimumBy
232+ , benchIOSink value "minimum" Ops.minimum
233+
234+ , benchIOSink value "toList" Ops.toList
235+ , benchIOSink value "toListRev" Ops.toListRev
230236 ]
231237 , bgroup "folds"
232− [ benchIOSink "drain" (S.fold FL.drain)
233− , benchIOSink "drainN" (S.fold (IFL.drainN Ops.value))
234− , benchIOSink "drainWhileTrue" (S.fold (IFL.drainWhile $ (<=) Ops.maxValue))
235− , benchIOSink "drainWhileFalse" (S.fold (IFL.drainWhile $ (>=) Ops.maxValue))
236− , benchIOSink "sink" (S.fold $ Sink.toFold Sink.drain)
237− , benchIOSink "last" (S.fold FL.last)
238− , benchIOSink "lastN.1" (S.fold (IA.lastN 1))
239− , benchIOSink "lastN.10" (S.fold (IA.lastN 10))
240− , benchIOSink "lastN.Max" (S.fold (IA.lastN Ops.maxValue))
241− , benchIOSink "length" (S.fold FL.length)
242− , benchIOSink "sum" (S.fold FL.sum)
243− , benchIOSink "product" (S.fold FL.product)
244− , benchIOSink "maximumBy" (S.fold (FL.maximumBy compare))
245− , benchIOSink "maximum" (S.fold FL.maximum)
246− , benchIOSink "minimumBy" (S.fold (FL.minimumBy compare))
247− , benchIOSink "minimum" (S.fold FL.minimum)
248− , benchIOSink "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))
250− , benchIOSink "stdDev" (\s -> S.fold FL.stdDev (S.map (fromIntegral :: Int -> Double) s))
251−
252− , benchIOSink "mconcat" (S.fold FL.mconcat . (S.map (Last . Just)))
253− , benchIOSink "foldMap" (S.fold (FL.foldMap (Last . Just)))
254−
255− , benchIOSink "toList" (S.fold FL.toList)
256− , benchIOSink "toListRevF" (S.fold IFL.toListRevF)
257− , benchIOSink "toStream" (S.fold IP.toStream)
258− , benchIOSink "toStreamRev" (S.fold IP.toStreamRev)
259− , benchIOSink "writeN" (S.fold (A.writeN Ops.value))
260−
261− , benchIOSink "index" (S.fold (FL.index Ops.maxValue))
262− , benchIOSink "head" (S.fold FL.head)
263− , benchIOSink "find" (S.fold (FL.find (== Ops.maxValue)))
264− , benchIOSink "findIndex" (S.fold (FL.findIndex (== Ops.maxValue)))
265− , benchIOSink "elemIndex" (S.fold (FL.elemIndex Ops.maxValue))
266−
267− , benchIOSink "null" (S.fold FL.null)
268− , benchIOSink "elem" (S.fold (FL.elem Ops.maxValue))
269− , benchIOSink "notElem" (S.fold (FL.notElem Ops.maxValue))
270− , benchIOSink "all" (S.fold (FL.all (<= Ops.maxValue)))
271− , benchIOSink "any" (S.fold (FL.any (> Ops.maxValue)))
272− , benchIOSink "and" (\s -> S.fold FL.and (S.map (<= Ops.maxValue) s))
273− , benchIOSink "or" (\s -> S.fold FL.or (S.map (> Ops.maxValue) s))
238+ [ benchIOSink value "drain" (S.fold FL.drain)
239+ , benchIOSink value "drainN" (S.fold (IFL.drainN value))
240+ , benchIOSink value "drainWhileTrue" (S.fold (IFL.drainWhile $ (<=) (value + 1)))
241+ , benchIOSink value "drainWhileFalse" (S.fold (IFL.drainWhile $ (>=) (value + 1)))
242+ , benchIOSink value "sink" (S.fold $ Sink.toFold Sink.drain)
243+ , benchIOSink value "last" (S.fold FL.last)
244+ , benchIOSink value "lastN.1" (S.fold (IA.lastN 1))
245+ , benchIOSink value "lastN.10" (S.fold (IA.lastN 10))
246+ , benchIOSink value "lastN.Max" (S.fold (IA.lastN (value + 1)))
247+ , benchIOSink value "length" (S.fold FL.length)
248+ , benchIOSink value "sum" (S.fold FL.sum)
249+ , benchIOSink value "product" (S.fold FL.product)
250+ , benchIOSink value "maximumBy" (S.fold (FL.maximumBy compare))
251+ , benchIOSink value "maximum" (S.fold FL.maximum)
252+ , benchIOSink value "minimumBy" (S.fold (FL.minimumBy compare))
253+ , benchIOSink value "minimum" (S.fold FL.minimum)
254+ , benchIOSink value "mean" (\s -> S.fold FL.mean (S.map (fromIntegral :: Int -> Double) s))
255+ , benchIOSink value "variance" (\s -> S.fold FL.variance (S.map (fromIntegral :: Int -> Double) s))
256+ , benchIOSink value "stdDev" (\s -> S.fold FL.stdDev (S.map (fromIntegral :: Int -> Double) s))
257+
258+ , benchIOSink value "mconcat" (S.fold FL.mconcat . (S.map (Last . Just)))
259+ , benchIOSink value "foldMap" (S.fold (FL.foldMap (Last . Just)))
260+
261+ , benchIOSink value "toList" (S.fold FL.toList)
262+ , benchIOSink value "toListRevF" (S.fold IFL.toListRevF)
263+ , benchIOSink value "toStream" (S.fold IP.toStream)
264+ , benchIOSink value "toStreamRev" (S.fold IP.toStreamRev)
265+ , benchIOSink value "writeN" (S.fold (A.writeN value))
266+
267+ , benchIOSink value "index" (S.fold (FL.index (value + 1)))
268+ , benchIOSink value "head" (S.fold FL.head)
269+ , benchIOSink value "find" (S.fold (FL.find (== (value + 1))))
270+ , benchIOSink value "findIndex" (S.fold (FL.findIndex (== (value + 1))))
271+ , benchIOSink value "elemIndex" (S.fold (FL.elemIndex (value + 1)))
272+
273+ , benchIOSink value "null" (S.fold FL.null)
274+ , benchIOSink value "elem" (S.fold (FL.elem (value + 1)))
275+ , benchIOSink value "notElem" (S.fold (FL.notElem (value + 1)))
276+ , benchIOSink value "all" (S.fold (FL.all (<= (value + 1))))
277+ , benchIOSink value "any" (S.fold (FL.any (> (value + 1))))
278+ , benchIOSink value "and" (\s -> S.fold FL.and (S.map (<= (value + 1)) s))
279+ , benchIOSink value "or" (\s -> S.fold FL.or (S.map (> (value + 1)) s))
274280 ]
275281 , bgroup "fold-multi-stream"
276− [ benchIOSink1 "eqBy" Ops.eqBy
277− , benchIOSink1 "cmpBy" Ops.cmpBy
278− , benchIOSink "isPrefixOf" Ops.isPrefixOf
279− , benchIOSink "isSubsequenceOf" Ops.isSubsequenceOf
280− , benchIOSink "stripPrefix" Ops.stripPrefix
282+ [ benchIOSink1 "eqBy" (Ops.eqBy value)
283+ , benchIOSink1 "cmpBy" (Ops.cmpBy value)
284+ , benchIOSink value "isPrefixOf" Ops.isPrefixOf
285+ , benchIOSink value "isSubsequenceOf" Ops.isSubsequenceOf
286+ , benchIOSink value "stripPrefix" Ops.stripPrefix
281287 ]
282288 , bgroup "folds-transforms"
283− [ benchIOSink "drain" (S.fold FL.drain)
284− , benchIOSink "lmap" (S.fold (IFL.lmap (+1) FL.drain))
285− , benchIOSink "pipe-mapM"
289+ [ benchIOSink value "drain" (S.fold FL.drain)
290+ , benchIOSink value "lmap" (S.fold (IFL.lmap (+1) FL.drain))
291+ , benchIOSink value "pipe-mapM"
286292 (S.fold (IFL.transform (Pipe.mapM (\x -> return $ x + 1)) FL.drain))
287293 ]
288294 , bgroup "folds-compositions" -- Applicative
289295 [
290− benchIOSink "all,any" (S.fold ((,) <$> FL.all (<= Ops.maxValue)
291− <*> FL.any (> Ops.maxValue)))
292− , benchIOSink "sum,length" (S.fold ((,) <$> FL.sum <*> FL.length))
296+ benchIOSink value "all,any" (S.fold ((,) <$> FL.all (<= (value + 1))
297+ <*> FL.any (> (value + 1))))
298+ , benchIOSink value "sum,length" (S.fold ((,) <$> FL.sum <*> FL.length))
293299 ]
294300 , bgroup "pipes"
295− [ benchIOSink "mapM" (Ops.transformMapM serially 1)
296− , benchIOSink "compose" (Ops.transformComposeMapM serially 1)
297− , benchIOSink "tee" (Ops.transformTeeMapM serially 1)
298− , benchIOSink "zip" (Ops.transformZipMapM serially 1)
301+ [ benchIOSink value "mapM" (Ops.transformMapM serially 1)
302+ , benchIOSink value "compose" (Ops.transformComposeMapM serially 1)
303+ , benchIOSink value "tee" (Ops.transformTeeMapM serially 1)
304+ , benchIOSink value "zip" (Ops.transformZipMapM serially 1)
299305 ]
300306 , bgroup "pipesX4"
301− [ benchIOSink "mapM" (Ops.transformMapM serially 4)
302− , benchIOSink "compose" (Ops.transformComposeMapM serially 4)
303− , benchIOSink "tee" (Ops.transformTeeMapM serially 4)
304− , benchIOSink "zip" (Ops.transformZipMapM serially 4)
307+ [ benchIOSink value "mapM" (Ops.transformMapM serially 4)
308+ , benchIOSink value "compose" (Ops.transformComposeMapM serially 4)
309+ , benchIOSink value "tee" (Ops.transformTeeMapM serially 4)
310+ , benchIOSink value "zip" (Ops.transformZipMapM serially 4)
305311 ]
306312 , bgroup "transformer"
307− [ benchIOSrc serially "evalState" Ops.evalStateT
308− , benchIOSrc serially "withState" Ops.withState
313+ [ benchIOSrc serially "evalState" (Ops.evalStateT value)
314+ , benchIOSrc serially "withState" (Ops.withState value)
309315 ]
310316 , bgroup "transformation"
311− [ benchIOSink "scanl" (Ops.scan 1)
312− , benchIOSink "scanl1'" (Ops.scanl1' 1)
313− , benchIOSink "map" (Ops.map 1)
314− , benchIOSink "fmap" (Ops.fmap 1)
315− , benchIOSink "mapM" (Ops.mapM serially 1)
316− , benchIOSink "mapMaybe" (Ops.mapMaybe 1)
317− , benchIOSink "mapMaybeM" (Ops.mapMaybeM 1)
317+ [ benchIOSink value "scanl" (Ops.scan 1)
318+ , benchIOSink value "scanl1'" (Ops.scanl1' 1)
319+ , benchIOSink value "map" (Ops.map 1)
320+ , benchIOSink value "fmap" (Ops.fmap 1)
321+ , benchIOSink value "mapM" (Ops.mapM serially 1)
322+ , benchIOSink value "mapMaybe" (Ops.mapMaybe 1)
323+ , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 1)
318324 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
319− Ops.sequence serially (Ops.sourceUnfoldrMAction n)
320− , benchIOSink "findIndices" (Ops.findIndices 1)
321− , benchIOSink "elemIndices" (Ops.elemIndices 1)
322− , benchIOSink "reverse" (Ops.reverse 1)
323− , benchIOSink "reverse'" (Ops.reverse' 1)
324− , benchIOSink "foldrS" (Ops.foldrS 1)
325− , benchIOSink "foldrSMap" (Ops.foldrSMap 1)
326− , benchIOSink "foldrT" (Ops.foldrT 1)
327− , benchIOSink "foldrTMap" (Ops.foldrTMap 1)
328− , benchIOSink "tap" (Ops.tap 1)
329− , benchIOSink "tapRate 1 second" (Ops.tapRate 1)
330− , benchIOSink "pollCounts 1 second" (Ops.pollCounts 1)
331− , benchIOSink "tapAsync" (Ops.tapAsync 1)
332− , benchIOSink "tapAsyncS" (Ops.tapAsyncS 1)
325+ Ops.sequence serially (Ops.sourceUnfoldrMAction value n)
326+ , benchIOSink value "findIndices" (Ops.findIndices value 1)
327+ , benchIOSink value "elemIndices" (Ops.elemIndices value 1)
328+ , benchIOSink value "reverse" (Ops.reverse 1)
329+ , benchIOSink value "reverse'" (Ops.reverse' 1)
330+ , benchIOSink value "foldrS" (Ops.foldrS 1)
331+ , benchIOSink value "foldrSMap" (Ops.foldrSMap 1)
332+ , benchIOSink value "foldrT" (Ops.foldrT 1)
333+ , benchIOSink value "foldrTMap" (Ops.foldrTMap 1)
334+ , benchIOSink value "tap" (Ops.tap 1)
335+ , benchIOSink value "tapRate 1 second" (Ops.tapRate 1)
336+ , benchIOSink value "pollCounts 1 second" (Ops.pollCounts 1)
337+ , benchIOSink value "tapAsync" (Ops.tapAsync 1)
338+ , benchIOSink value "tapAsyncS" (Ops.tapAsyncS 1)
333339 ]
334340 , bgroup "transformationX4"
335− [ benchIOSink "scan" (Ops.scan 4)
336− , benchIOSink "scanl1'" (Ops.scanl1' 4)
337− , benchIOSink "map" (Ops.map 4)
338− , benchIOSink "fmap" (Ops.fmap 4)
339− , benchIOSink "mapM" (Ops.mapM serially 4)
340− , benchIOSink "mapMaybe" (Ops.mapMaybe 4)
341− , benchIOSink "mapMaybeM" (Ops.mapMaybeM 4)
341+ [ benchIOSink value "scan" (Ops.scan 4)
342+ , benchIOSink value "scanl1'" (Ops.scanl1' 4)
343+ , benchIOSink value "map" (Ops.map 4)
344+ , benchIOSink value "fmap" (Ops.fmap 4)
345+ , benchIOSink value "mapM" (Ops.mapM serially 4)
346+ , benchIOSink value "mapMaybe" (Ops.mapMaybe 4)
347+ , benchIOSink value "mapMaybeM" (Ops.mapMaybeM 4)
342348 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
343349 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
344− , benchIOSink "findIndices" (Ops.findIndices 4)
345− , benchIOSink "elemIndices" (Ops.elemIndices 4)
350+ , benchIOSink value "findIndices" (Ops.findIndices value 4)
351+ , benchIOSink value "elemIndices" (Ops.elemIndices value 4)
346352 ]
347353 , bgroup "filtering"
348− [ benchIOSink "filter-even" (Ops.filterEven 1)
349− , benchIOSink "filter-all-out" (Ops.filterAllOut 1)
350− , benchIOSink "filter-all-in" (Ops.filterAllIn 1)
351− , benchIOSink "take-all" (Ops.takeAll 1)
352− , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 1)
353− --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
354− , benchIOSink "drop-one" (Ops.dropOne 1)
355− , benchIOSink "drop-all" (Ops.dropAll 1)
356− , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 1)
357− --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
358− , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 1)
359− , benchIOSink "deleteBy" (Ops.deleteBy 1)
360− , benchIOSink "intersperse" (Ops.intersperse 1)
361− , benchIOSink "insertBy" (Ops.insertBy 1)
354+ [ benchIOSink value "filter-even" (Ops.filterEven 1)
355+ , benchIOSink value "filter-all-out" (Ops.filterAllOut value 1)
356+ , benchIOSink value "filter-all-in" (Ops.filterAllIn value 1)
357+ , benchIOSink value "take-all" (Ops.takeAll value 1)
358+ , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 1)
359+ --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 1)
360+ , benchIOSink value "drop-one" (Ops.dropOne 1)
361+ , benchIOSink value "drop-all" (Ops.dropAll value 1)
362+ , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 1)
363+ --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 1)
364+ , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 1)
365+ , benchIOSink value "deleteBy" (Ops.deleteBy value 1)
366+ , benchIOSink value "intersperse" (Ops.intersperse value 1)
367+ , benchIOSink value "insertBy" (Ops.insertBy value 1)
362368 ]
363369 , bgroup "filteringX4"
364− [ benchIOSink "filter-even" (Ops.filterEven 4)
365− , benchIOSink "filter-all-out" (Ops.filterAllOut 4)
366− , benchIOSink "filter-all-in" (Ops.filterAllIn 4)
367− , benchIOSink "take-all" (Ops.takeAll 4)
368− , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 4)
369− --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
370− , benchIOSink "drop-one" (Ops.dropOne 4)
371− , benchIOSink "drop-all" (Ops.dropAll 4)
372− , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 4)
373− --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
374− , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 4)
375− , benchIOSink "deleteBy" (Ops.deleteBy 4)
376− , benchIOSink "intersperse" (Ops.intersperse 4)
377− , benchIOSink "insertBy" (Ops.insertBy 4)
370+ [ benchIOSink value "filter-even" (Ops.filterEven 4)
371+ , benchIOSink value "filter-all-out" (Ops.filterAllOut value 4)
372+ , benchIOSink value "filter-all-in" (Ops.filterAllIn value 4)
373+ , benchIOSink value "take-all" (Ops.takeAll value 4)
374+ , benchIOSink value "takeWhile-true" (Ops.takeWhileTrue value 4)
375+ --, benchIOSink value "takeWhileM-true" (Ops.takeWhileMTrue 4)
376+ , benchIOSink value "drop-one" (Ops.dropOne 4)
377+ , benchIOSink value "drop-all" (Ops.dropAll value 4)
378+ , benchIOSink value "dropWhile-true" (Ops.dropWhileTrue value 4)
379+ --, benchIOSink value "dropWhileM-true" (Ops.dropWhileMTrue 4)
380+ , benchIOSink value "dropWhile-false" (Ops.dropWhileFalse value 4)
381+ , benchIOSink value "deleteBy" (Ops.deleteBy value 4)
382+ , benchIOSink value "intersperse" (Ops.intersperse value 4)
383+ , benchIOSink value "insertBy" (Ops.insertBy value 4)
378384 ]
379385 , bgroup "joining"
380− [ benchIOSrc1 "zip (2,x/2)" (Ops.zip (Ops.value `div` 2))
381− , benchIOSrc1 "zipM (2,x/2)" (Ops.zipM (Ops.value `div` 2))
382− , benchIOSrc1 "mergeBy (2,x/2)" (Ops.mergeBy (Ops.value `div` 2))
383− , benchIOSrc1 "serial (2,x/2)" (Ops.serial2 (Ops.value `div` 2))
384− , benchIOSrc1 "append (2,x/2)" (Ops.append2 (Ops.value `div` 2))
385− , benchIOSrc1 "serial (2,2,x/4)" (Ops.serial4 (Ops.value `div` 4))
386− , benchIOSrc1 "append (2,2,x/4)" (Ops.append4 (Ops.value `div` 4))
387− , benchIOSrc1 "wSerial (2,x/2)" Ops.wSerial2
388− , benchIOSrc1 "interleave (2,x/2)" Ops.interleave2
389− , benchIOSrc1 "roundRobin (2,x/2)" Ops.roundRobin2
386+ [ benchIOSrc1 "zip (2,x/2)" (Ops.zip (value `div` 2))
387+ , benchIOSrc1 "zipM (2,x/2)" (Ops.zipM (value `div` 2))
388+ , benchIOSrc1 "mergeBy (2,x/2)" (Ops.mergeBy (value `div` 2))
389+ , benchIOSrc1 "serial (2,x/2)" (Ops.serial2 (value `div` 2))
390+ , benchIOSrc1 "append (2,x/2)" (Ops.append2 (value `div` 2))
391+ , benchIOSrc1 "serial (2,2,x/4)" (Ops.serial4 (value `div` 4))
392+ , benchIOSrc1 "append (2,2,x/4)" (Ops.append4 (value `div` 4))
393+ , benchIOSrc1 "wSerial (2,x/2)" (Ops.wSerial2 value)
394+ , benchIOSrc1 "interleave (2,x/2)" (Ops.interleave2 value)
395+ , benchIOSrc1 "roundRobin (2,x/2)" (Ops.roundRobin2 value)
390396 ]
391397 , bgroup "concat-foldable"
392− [ benchIOSrc serially "foldMapWith" Ops.sourceFoldMapWith
393− , benchIOSrc serially "foldMapWithM" Ops.sourceFoldMapWithM
394− , benchIOSrc serially "foldMapM" Ops.sourceFoldMapM
395− , benchIOSrc serially "foldWithConcatMapId" Ops.sourceConcatMapId
398+ [ benchIOSrc serially "foldMapWith" (Ops.sourceFoldMapWith value)
399+ , benchIOSrc serially "foldMapWithM" (Ops.sourceFoldMapWithM value)
400+ , benchIOSrc serially "foldMapM" (Ops.sourceFoldMapM value)
401+ , benchIOSrc serially "foldWithConcatMapId" (Ops.sourceConcatMapId value)
396402 ]
397403 , bgroup "concat-serial"
398− [ benchIOSrc1 "concatMapPure (2,x/2)" (Ops.concatMapPure 2 (Ops.value `div` 2))
399− , benchIOSrc1 "concatMap (2,x/2)" (Ops.concatMap 2 (Ops.value `div` 2))
400− , benchIOSrc1 "concatMap (x/2,2)" (Ops.concatMap (Ops.value `div` 2) 2)
401− , benchIOSrc1 "concatMapRepl (x/4,4)" Ops.concatMapRepl4xN
402− , benchIOSrc1 "concatUnfoldRepl (x/4,4)" Ops.concatUnfoldRepl4xN
404+ [ benchIOSrc1 "concatMapPure (2,x/2)" (Ops.concatMapPure 2 (value `div` 2))
405+ , benchIOSrc1 "concatMap (2,x/2)" (Ops.concatMap 2 (value `div` 2))
406+ , benchIOSrc1 "concatMap (x/2,2)" (Ops.concatMap (value `div` 2) 2)
407+ , benchIOSrc1 "concatMapRepl (x/4,4)" (Ops.concatMapRepl4xN value)
408+ , benchIOSrc1 "concatUnfoldRepl (x/4,4)" (Ops.concatUnfoldRepl4xN value)
403409
404410 , benchIOSrc1 "concatMapWithSerial (2,x/2)"
405− (Ops.concatMapWithSerial 2 (Ops.value `div` 2))
411+ (Ops.concatMapWithSerial 2 (value `div` 2))
406412 , benchIOSrc1 "concatMapWithSerial (x/2,2)"
407− (Ops.concatMapWithSerial (Ops.value `div` 2) 2)
413+ (Ops.concatMapWithSerial (value `div` 2) 2)
408414
409415 , benchIOSrc1 "concatMapWithAppend (2,x/2)"
410− (Ops.concatMapWithAppend 2 (Ops.value `div` 2))
416+ (Ops.concatMapWithAppend 2 (value `div` 2))
411417 ]
412418 , bgroup "concat-interleave"
413419 [ benchIOSrc1 "concatMapWithWSerial (2,x/2)"
414− (Ops.concatMapWithWSerial 2 (Ops.value `div` 2))
420+ (Ops.concatMapWithWSerial 2 (value `div` 2))
415421 , benchIOSrc1 "concatMapWithWSerial (x/2,2)"
416− (Ops.concatMapWithWSerial (Ops.value `div` 2) 2)
422+ (Ops.concatMapWithWSerial (value `div` 2) 2)
417423 , benchIOSrc1 "concatUnfoldInterleaveRepl (x/4,4)"
418− Ops.concatUnfoldInterleaveRepl4xN
424+ (Ops.concatUnfoldInterleaveRepl4xN value)
419425 , benchIOSrc1 "concatUnfoldRoundrobinRepl (x/4,4)"
420− Ops.concatUnfoldRoundrobinRepl4xN
426+ (Ops.concatUnfoldRoundrobinRepl4xN value)
421427 ]
422428 -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
423429 -- library. If scan/fold followed by a map is efficient enough we may not
424430 -- need monolithic implementations of these.
425431 , bgroup "mixed"
426− [ benchIOSink "scanl-map" (Ops.scanMap 1)
427− , benchIOSink "foldl-map" Ops.foldl'ReduceMap
428− , benchIOSink "sum-product-fold" Ops.sumProductFold
429− , benchIOSink "sum-product-scan" Ops.sumProductScan
432+ [ benchIOSink value "scanl-map" (Ops.scanMap 1)
433+ , benchIOSink value "foldl-map" Ops.foldl'ReduceMap
434+ , benchIOSink value "sum-product-fold" Ops.sumProductFold
435+ , benchIOSink value "sum-product-scan" Ops.sumProductScan
430436 ]
431437 , bgroup "mixedX4"
432− [ benchIOSink "scan-map" (Ops.scanMap 4)
433− , benchIOSink "drop-map" (Ops.dropMap 4)
434− , benchIOSink "drop-scan" (Ops.dropScan 4)
435− , benchIOSink "take-drop" (Ops.takeDrop 4)
436− , benchIOSink "take-scan" (Ops.takeScan 4)
437− , benchIOSink "take-map" (Ops.takeMap 4)
438− , benchIOSink "filter-drop" (Ops.filterDrop 4)
439− , benchIOSink "filter-take" (Ops.filterTake 4)
440− , benchIOSink "filter-scan" (Ops.filterScan 4)
441− , benchIOSink "filter-scanl1" (Ops.filterScanl1 4)
442− , benchIOSink "filter-map" (Ops.filterMap 4)
438+ [ benchIOSink value "scan-map" (Ops.scanMap 4)
439+ , benchIOSink value "drop-map" (Ops.dropMap 4)
440+ , benchIOSink value "drop-scan" (Ops.dropScan 4)
441+ , benchIOSink value "take-drop" (Ops.takeDrop value 4)
442+ , benchIOSink value "take-scan" (Ops.takeScan value 4)
443+ , benchIOSink value "take-map" (Ops.takeMap value 4)
444+ , benchIOSink value "filter-drop" (Ops.filterDrop value 4)
445+ , benchIOSink value "filter-take" (Ops.filterTake value 4)
446+ , benchIOSink value "filter-scan" (Ops.filterScan 4)
447+ , benchIOSink value "filter-scanl1" (Ops.filterScanl1 4)
448+ , benchIOSink value "filter-map" (Ops.filterMap value 4)
443449 ]
444450 , bgroup "iterated"
445451 [ benchIOSrc serially "mapM" Ops.iterateMapM
446452 , benchIOSrc serially "scan(1/100)" Ops.iterateScan
447453 , benchIOSrc serially "scanl1(1/100)" Ops.iterateScanl1
448454 , benchIOSrc serially "filterEven" Ops.iterateFilterEven
449− , benchIOSrc serially "takeAll" Ops.iterateTakeAll
455+ , benchIOSrc serially "takeAll" (Ops.iterateTakeAll value)
450456 , benchIOSrc serially "dropOne" Ops.iterateDropOne
451− , benchIOSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
452− , benchIOSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
457+ , benchIOSrc serially "dropWhileFalse" (Ops.iterateDropWhileFalse value)
458+ , benchIOSrc serially "dropWhileTrue" (Ops.iterateDropWhileTrue value)
453459 ]
454460 ]
455461 , bgroup "wSerially"
456462 [ bgroup "transformation"
457− [ benchIOSink "fmap" $ Ops.fmap' wSerially 1
463+ [ benchIOSink value "fmap" $ Ops.fmap' wSerially 1
458464 ]
459465 ]
460466 , bgroup "zipSerially"
461467 [ bgroup "transformation"
462− [ benchIOSink "fmap" $ Ops.fmap' zipSerially 1
468+ [ benchIOSink value "fmap" $ Ops.fmap' zipSerially 1
463469 ]
464470 ]
465471 , bgroup "zipAsyncly"
466472 [ bgroup "transformation"
467− [ benchIOSink "fmap" $ Ops.fmap' zipAsyncly 1
473+ [ benchIOSink value "fmap" $ Ops.fmap' zipAsyncly 1
468474 ]
469475 ]
470476 ]
477+ where
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)