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