@@ -6,157 +6,189 @@
66-- Maintainer : harendra.kumar@gmail.com
77
88import Control.DeepSeq (NFData)
9−-- import Data.Functor.Identity (Identity, runIdentity)
9+import Data.Functor.Identity (Identity, runIdentity)
1010import System.Random (randomRIO)
11+
12+import qualified GHC.Exts as GHC
1113import qualified LinearOps as Ops
1214
1315import Streamly
16+import qualified Streamly.Prelude as S
1417import Gauge
1518
1619-- We need a monadic bind here to make sure that the function f does not get
1720-- completely optimized out by the compiler in some cases.
18−--
21+
1922-- | Takes a fold method, and uses it with a default source.
20−{-# INLINE benchIO #-}
21−benchIO :: (IsStream t, NFData b) => String -> (t IO Int -> IO b) -> Benchmark
22−benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
23+{-# INLINE benchIOSink #-}
24+benchIOSink
25+ :: (IsStream t, NFData b)
26+ => String -> (t IO Int -> IO b) -> Benchmark
27+benchIOSink name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
2328
2429-- | Takes a source, and uses it with a default drain/fold method.
25−{-# INLINE benchSrcIO #-}
26−benchSrcIO
30+{-# INLINE benchIOSrc #-}
31+benchIOSrc
2732 :: (t IO Int -> SerialT IO Int)
2833 -> String
2934 -> (Int -> t IO Int)
3035 -> Benchmark
31−benchSrcIO t name f
32− = bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
36+benchIOSrc t name f =
37+ bench name $ nfIO $ randomRIO (1,1) >>= (Ops.toNull t) . f
38+
39+{-# INLINE benchPure #-}
40+benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
41+benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
3342
34−{-
35−_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
36−_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
37−-}
43+{-# INLINE benchPureSink #-}
44+benchPureSink :: NFData b => String -> (SerialT Identity Int -> b) -> Benchmark
45+benchPureSink name f = benchPure name Ops.sourceUnfoldr f
46+
47+{-# INLINE benchPureSrc #-}
48+benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
49+benchPureSrc name src = benchPure name src (runIdentity . runStream)
3850
3951main :: IO ()
4052main =
4153 defaultMain
4254 [ bgroup "serially"
43− [ bgroup "generation"
55+ [ bgroup "pure"
56+ [ benchPureSink "eqBy" Ops.eqBy
57+ , benchPureSink "==" Ops.eqInstance
58+ , benchPureSink "/=" Ops.eqInstanceNotEq
59+ , benchPureSink "cmpBy" Ops.cmpBy
60+ , benchPureSink "<" Ops.ordInstance
61+ , benchPureSink "min" Ops.ordInstanceMin
62+ , benchPureSrc "IsList.fromList" Ops.sourceIsList
63+ , benchPureSink "IsList.toList" GHC.toList
64+ , benchPureSrc "IsString.fromString" Ops.sourceIsString
65+ , benchPure "readsPrec" (\n -> S.fromList [1..n :: Int])
66+ Ops.readInstance
67+ , benchPureSink "showsPrec" Ops.showInstance
68+ , benchPure "showsPrecList" (\n -> S.fromList [1..n :: Int])
69+ Ops.showInstanceList
70+ ]
71+ , bgroup "generation"
4472 [ -- Most basic, barely stream continuations running
45− benchSrcIO serially "unfoldr" Ops.sourceUnfoldr
46− , benchSrcIO serially "unfoldrM" Ops.sourceUnfoldrM
47− , benchSrcIO serially "fromList" Ops.sourceFromList
48− , benchSrcIO serially "fromListM" Ops.sourceFromListM
73+ benchIOSrc serially "unfoldr" Ops.sourceUnfoldr
74+ , benchIOSrc serially "unfoldrM" Ops.sourceUnfoldrM
75+ , benchIOSrc serially "fromList" Ops.sourceFromList
76+ , benchIOSrc serially "fromListM" Ops.sourceFromListM
4977 -- These are essentially cons and consM
50− , benchSrcIO serially "fromFoldable" Ops.sourceFromFoldable
51− , benchSrcIO serially "fromFoldableM" Ops.sourceFromFoldableM
78+ , benchIOSrc serially "fromFoldable" Ops.sourceFromFoldable
79+ , benchIOSrc serially "fromFoldableM" Ops.sourceFromFoldableM
5280 -- These are essentially appends
53− , benchSrcIO serially "foldMapWith" Ops.sourceFoldMapWith
54− , benchSrcIO serially "foldMapWithM" Ops.sourceFoldMapWithM
81+ , benchIOSrc serially "foldMapWith" Ops.sourceFoldMapWith
82+ , benchIOSrc serially "foldMapWithM" Ops.sourceFoldMapWithM
5583 ]
5684 , bgroup "elimination"
57− [ benchIO "toNull" $ Ops.toNull serially
58− , benchIO "uncons" Ops.uncons
59− , benchIO "init" Ops.init
60− , benchIO "tail" Ops.tail
61− , benchIO "nullHeadTail" Ops.nullHeadTail
62− , benchIO "mapM_" Ops.mapM_
63− , benchIO "toList" Ops.toList
64− , benchIO "foldr" Ops.foldr
65− , benchIO "foldr1" Ops.foldr1
66− , benchIO "foldrM" Ops.foldrM
67− , benchIO "foldl'" Ops.foldl'
68− , benchIO "foldl1'" Ops.foldl1'
85+ [ benchIOSink "toNull" $ Ops.toNull serially
86+ , benchIOSink "uncons" Ops.uncons
87+ , benchIOSink "init" Ops.init
88+ , benchIOSink "tail" Ops.tail
89+ , benchIOSink "nullHeadTail" Ops.nullHeadTail
90+ , benchIOSink "mapM_" Ops.mapM_
91+ , benchIOSink "toList" Ops.toList
92+ , benchIOSink "foldr" Ops.foldr
93+ , benchIOSink "foldr1" Ops.foldr1
94+ , benchIOSink "foldrM" Ops.foldrM
95+ , benchIOSink "foldl'" Ops.foldl'
96+ , benchIOSink "foldl1'" Ops.foldl1'
6997
70− , benchIO "last" Ops.last
71− , benchIO "length" Ops.length
72− , benchIO "elem" Ops.elem
73− , benchIO "notElem" Ops.notElem
74− , benchIO "all" Ops.all
75− , benchIO "any" Ops.any
76− , benchIO "and" Ops.and
77− , benchIO "or" Ops.or
78− , benchIO "find" Ops.find
79− , benchIO "findIndex" Ops.findIndex
80− , benchIO "elemIndex" Ops.elemIndex
81− , benchIO "maximum" Ops.maximum
82− , benchIO "minimum" Ops.minimum
83− , benchIO "sum" Ops.sum
84− , benchIO "product" Ops.product
98+ , benchIOSink "last" Ops.last
99+ , benchIOSink "length" Ops.length
100+ , benchIOSink "elem" Ops.elem
101+ , benchIOSink "notElem" Ops.notElem
102+ , benchIOSink "all" Ops.all
103+ , benchIOSink "any" Ops.any
104+ , benchIOSink "and" Ops.and
105+ , benchIOSink "or" Ops.or
106+ , benchIOSink "find" Ops.find
107+ , benchIOSink "findIndex" Ops.findIndex
108+ , benchIOSink "elemIndex" Ops.elemIndex
109+ , benchIOSink "maximum" Ops.maximum
110+ , benchIOSink "minimum" Ops.minimum
111+ , benchIOSink "sum" Ops.sum
112+ , benchIOSink "product" Ops.product
85113 ]
86114 , bgroup "transformation"
87− [ benchIO "scan" (Ops.scan 1)
88− , benchIO "map" (Ops.map 1)
89− , benchIO "fmap" (Ops.fmap 1)
90− , benchIO "mapM" (Ops.mapM serially 1)
91− , benchIO "mapMaybe" (Ops.mapMaybe 1)
92− , benchIO "mapMaybeM" (Ops.mapMaybeM 1)
115+ [ benchIOSink "scan" (Ops.scan 1)
116+ , benchIOSink "map" (Ops.map 1)
117+ , benchIOSink "fmap" (Ops.fmap 1)
118+ , benchIOSink "mapM" (Ops.mapM serially 1)
119+ , benchIOSink "mapMaybe" (Ops.mapMaybe 1)
120+ , benchIOSink "mapMaybeM" (Ops.mapMaybeM 1)
93121 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
94122 Ops.sequence serially (Ops.sourceUnfoldrMAction n)
95− , benchIO "findIndices" (Ops.findIndices 1)
96− , benchIO "elemIndices" (Ops.elemIndices 1)
97− -- , benchIO "concat" Ops.concat
123+ , benchIOSink "findIndices" (Ops.findIndices 1)
124+ , benchIOSink "elemIndices" (Ops.elemIndices 1)
125+ -- , benchIOSink "concat" Ops.concat
98126 ]
99127 , bgroup "transformationX4"
100− [ benchIO "scan" (Ops.scan 4)
101− , benchIO "map" (Ops.map 4)
102− , benchIO "fmap" (Ops.fmap 4)
103− , benchIO "mapM" (Ops.mapM serially 4)
104− , benchIO "mapMaybe" (Ops.mapMaybe 4)
105− , benchIO "mapMaybeM" (Ops.mapMaybeM 4)
128+ [ benchIOSink "scan" (Ops.scan 4)
129+ , benchIOSink "map" (Ops.map 4)
130+ , benchIOSink "fmap" (Ops.fmap 4)
131+ , benchIOSink "mapM" (Ops.mapM serially 4)
132+ , benchIOSink "mapMaybe" (Ops.mapMaybe 4)
133+ , benchIOSink "mapMaybeM" (Ops.mapMaybeM 4)
106134 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
107135 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
108− , benchIO "findIndices" (Ops.findIndices 4)
109− , benchIO "elemIndices" (Ops.elemIndices 4)
110− -- , benchIO "concat" Ops.concat
136+ , benchIOSink "findIndices" (Ops.findIndices 4)
137+ , benchIOSink "elemIndices" (Ops.elemIndices 4)
138+ -- , benchIOSink "concat" Ops.concat
111139 ]
112140 , bgroup "filtering"
113− [ benchIO "filter-even" (Ops.filterEven 1)
114− , benchIO "filter-all-out" (Ops.filterAllOut 1)
115− , benchIO "filter-all-in" (Ops.filterAllIn 1)
116− , benchIO "take-all" (Ops.takeAll 1)
117− , benchIO "takeWhile-true" (Ops.takeWhileTrue 1)
118− --, benchIO "takeWhileM-true" (Ops.takeWhileMTrue 1)
119− , benchIO "drop-one" (Ops.dropOne 1)
120− , benchIO "drop-all" (Ops.dropAll 1)
121− , benchIO "dropWhile-true" (Ops.dropWhileTrue 1)
122− --, benchIO "dropWhileM-true" (Ops.dropWhileMTrue 1)
123− , benchIO "dropWhile-false" (Ops.dropWhileFalse 1)
141+ [ benchIOSink "filter-even" (Ops.filterEven 1)
142+ , benchIOSink "filter-all-out" (Ops.filterAllOut 1)
143+ , benchIOSink "filter-all-in" (Ops.filterAllIn 1)
144+ , benchIOSink "take-all" (Ops.takeAll 1)
145+ , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 1)
146+ --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
147+ , benchIOSink "drop-one" (Ops.dropOne 1)
148+ , benchIOSink "drop-all" (Ops.dropAll 1)
149+ , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 1)
150+ --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
151+ , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 1)
124152 ]
125153 , bgroup "filteringX4"
126− [ benchIO "filter-even" (Ops.filterEven 4)
127− , benchIO "filter-all-out" (Ops.filterAllOut 4)
128− , benchIO "filter-all-in" (Ops.filterAllIn 4)
129− , benchIO "take-all" (Ops.takeAll 4)
130− , benchIO "takeWhile-true" (Ops.takeWhileTrue 4)
131− --, benchIO "takeWhileM-true" (Ops.takeWhileMTrue 4)
132− , benchIO "drop-one" (Ops.dropOne 4)
133− , benchIO "drop-all" (Ops.dropAll 4)
134− , benchIO "dropWhile-true" (Ops.dropWhileTrue 4)
135− --, benchIO "dropWhileM-true" (Ops.dropWhileMTrue 4)
136− , benchIO "dropWhile-false" (Ops.dropWhileFalse 4)
154+ [ benchIOSink "filter-even" (Ops.filterEven 4)
155+ , benchIOSink "filter-all-out" (Ops.filterAllOut 4)
156+ , benchIOSink "filter-all-in" (Ops.filterAllIn 4)
157+ , benchIOSink "take-all" (Ops.takeAll 4)
158+ , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 4)
159+ --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
160+ , benchIOSink "drop-one" (Ops.dropOne 4)
161+ , benchIOSink "drop-all" (Ops.dropAll 4)
162+ , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 4)
163+ --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
164+ , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 4)
165+ ]
166+ , bgroup "zipping"
167+ [ benchIOSink "eqBy" Ops.eqBy
168+ , benchIOSink "cmpBy" Ops.cmpBy
169+ , benchIOSink "zip" Ops.zip
170+ , benchIOSink "zipM" Ops.zipM
137171 ]
138− , benchIO "zip" Ops.zip
139− , benchIO "zipM" Ops.zipM
140172 , bgroup "mixedX4"
141− [ benchIO "scan-map" (Ops.scanMap 4)
142− , benchIO "drop-map" (Ops.dropMap 4)
143− , benchIO "drop-scan" (Ops.dropScan 4)
144− , benchIO "take-drop" (Ops.takeDrop 4)
145− , benchIO "take-scan" (Ops.takeScan 4)
146− , benchIO "take-map" (Ops.takeMap 4)
147− , benchIO "filter-drop" (Ops.filterDrop 4)
148− , benchIO "filter-take" (Ops.filterTake 4)
149− , benchIO "filter-scan" (Ops.filterScan 4)
150− , benchIO "filter-map" (Ops.filterMap 4)
173+ [ benchIOSink "scan-map" (Ops.scanMap 4)
174+ , benchIOSink "drop-map" (Ops.dropMap 4)
175+ , benchIOSink "drop-scan" (Ops.dropScan 4)
176+ , benchIOSink "take-drop" (Ops.takeDrop 4)
177+ , benchIOSink "take-scan" (Ops.takeScan 4)
178+ , benchIOSink "take-map" (Ops.takeMap 4)
179+ , benchIOSink "filter-drop" (Ops.filterDrop 4)
180+ , benchIOSink "filter-take" (Ops.filterTake 4)
181+ , benchIOSink "filter-scan" (Ops.filterScan 4)
182+ , benchIOSink "filter-map" (Ops.filterMap 4)
151183 ]
152184 , bgroup "iterated"
153− [ benchSrcIO serially "mapM" Ops.iterateMapM
154− , benchSrcIO serially "scan(1/100)" Ops.iterateScan
155− , benchSrcIO serially "filterEven" Ops.iterateFilterEven
156− , benchSrcIO serially "takeAll" Ops.iterateTakeAll
157− , benchSrcIO serially "dropOne" Ops.iterateDropOne
158− , benchSrcIO serially "dropWhileFalse" Ops.iterateDropWhileFalse
159− , benchSrcIO serially "dropWhileTrue" Ops.iterateDropWhileTrue
185+ [ benchIOSrc serially "mapM" Ops.iterateMapM
186+ , benchIOSrc serially "scan(1/100)" Ops.iterateScan
187+ , benchIOSrc serially "filterEven" Ops.iterateFilterEven
188+ , benchIOSrc serially "takeAll" Ops.iterateTakeAll
189+ , benchIOSrc serially "dropOne" Ops.iterateDropOne
190+ , benchIOSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
191+ , benchIOSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
160192 ]
161193 ]
162194 ]