on 57fad21 help sign in
streamly/benchmark/Linear.hs
228 lines 9.7 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2018 Harendra Kumar
4--
5-- License : BSD3
6-- Maintainer : harendra.kumar@gmail.com
8import Control.DeepSeq (NFData)
9import Data.Functor.Identity (Identity, runIdentity)
10import System.Random (randomRIO)
12import qualified GHC.Exts as GHC
13import qualified LinearOps as Ops
15import Streamly
16import qualified Streamly.Prelude as S
17import Gauge
19-- We need a monadic bind here to make sure that the function f does not get
20-- completely optimized out by the compiler in some cases.
22-- | Takes a fold method, and uses it with a default source.
23{-# INLINE benchIOSink #-}
24benchIOSink
25 :: (IsStream t, NFData b)
26 => String -> (t IO Int -> IO b) -> Benchmark
27benchIOSink name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
29-- | Takes a source, and uses it with a default drain/fold method.
30{-# INLINE benchIOSrc #-}
31benchIOSrc
32 :: (t IO a -> SerialT IO a)
33 -> String
34 -> (Int -> t IO a)
35 -> Benchmark
36benchIOSrc t name f =
37 bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
39{-# INLINE benchPure #-}
40benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
41benchPure name src f = bench name $ nfIO $ randomRIO (1,1) >>= return . f . src
43{-# INLINE benchPureSink #-}
44benchPureSink :: NFData b => String -> (SerialT Identity Int -> b) -> Benchmark
45benchPureSink name f = benchPure name Ops.sourceUnfoldr f
47{-# INLINE benchPureSinkIO #-}
48benchPureSinkIO
49 :: NFData b
50 => String -> (SerialT Identity Int -> IO b) -> Benchmark
51benchPureSinkIO name f =
52 bench name $ nfIO $ randomRIO (1, 1) >>= f . Ops.sourceUnfoldr
54{-# INLINE benchPureSrc #-}
55benchPureSrc :: String -> (Int -> SerialT Identity a) -> Benchmark
56benchPureSrc name src = benchPure name src (runIdentity . runStream)
58main :: IO ()
59main =
60 defaultMain
61 [ bgroup "serially"
62 [ bgroup "pure"
63 [ benchPureSink "id" id
64 , benchPureSink "eqBy" Ops.eqBy
65 , benchPureSink "==" Ops.eqInstance
66 , benchPureSink "/=" Ops.eqInstanceNotEq
67 , benchPureSink "cmpBy" Ops.cmpBy
68 , benchPureSink "<" Ops.ordInstance
69 , benchPureSink "min" Ops.ordInstanceMin
70 , benchPureSrc "IsList.fromList" Ops.sourceIsList
71 , benchPureSink "IsList.toList" GHC.toList
72 , benchPureSrc "IsString.fromString" Ops.sourceIsString
73 , benchPure "readsPrec" (\n -> S.fromList [1..n :: Int])
74 Ops.readInstance
75 , benchPureSink "showsPrec" Ops.showInstance
76 , benchPure "showsPrecList" (\n -> S.fromList [1..n :: Int])
77 Ops.showInstanceList
78 , benchPureSink "foldl'" Ops.pureFoldl'
79 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
80 , benchPureSink "foldable/sum" Ops.foldableSum
81 , benchPureSinkIO "traversable/mapM" Ops.traversableMapM
82 ]
83 , bgroup "generation"
84 [ -- Most basic, barely stream continuations running
85 benchIOSrc serially "unfoldr" Ops.sourceUnfoldr
86 , benchIOSrc serially "unfoldrM" Ops.sourceUnfoldrM
87 , benchIOSrc serially "intFromTo" Ops.sourceIntFromTo
88 , benchIOSrc serially "intFromThenTo" Ops.sourceIntFromThenTo
89 , benchIOSrc serially "integerFromStep" Ops.sourceIntegerFromStep
90 , benchIOSrc serially "fracFromThenTo" Ops.sourceFracFromThenTo
91 , benchIOSrc serially "fracFromTo" Ops.sourceFracFromTo
92 , benchIOSrc serially "fromList" Ops.sourceFromList
93 , benchIOSrc serially "fromListM" Ops.sourceFromListM
94 -- These are essentially cons and consM
95 , benchIOSrc serially "fromFoldable" Ops.sourceFromFoldable
96 , benchIOSrc serially "fromFoldableM" Ops.sourceFromFoldableM
97 -- These are essentially appends
98 , benchIOSrc serially "foldMapWith" Ops.sourceFoldMapWith
99 , benchIOSrc serially "foldMapWithM" Ops.sourceFoldMapWithM
100 ]
101 , bgroup "elimination"
102 [ benchIOSink "toNull" $ Ops.toNull serially
103 , benchIOSink "uncons" Ops.uncons
104 , benchIOSink "init" Ops.init
105 , benchIOSink "tail" Ops.tail
106 , benchIOSink "nullHeadTail" Ops.nullHeadTail
107 , benchIOSink "mapM_" Ops.mapM_
108 , benchIOSink "toList" Ops.toList
109 , benchIOSink "foldr" Ops.foldr
110 , benchIOSink "foldr1" Ops.foldr1
111 , benchIOSink "foldrM" Ops.foldrM
112 , benchIOSink "foldl'" Ops.foldl'
113 , benchIOSink "foldl1'" Ops.foldl1'
115 , benchIOSink "last" Ops.last
116 , benchIOSink "length" Ops.length
117 , benchIOSink "elem" Ops.elem
118 , benchIOSink "notElem" Ops.notElem
119 , benchIOSink "all" Ops.all
120 , benchIOSink "any" Ops.any
121 , benchIOSink "and" Ops.and
122 , benchIOSink "or" Ops.or
123 , benchIOSink "find" Ops.find
124 , benchIOSink "findIndex" Ops.findIndex
125 , benchIOSink "elemIndex" Ops.elemIndex
126 , benchIOSink "maximum" Ops.maximum
127 , benchIOSink "maximumBy" Ops.maximumBy
128 , benchIOSink "minimum" Ops.minimum
129 , benchIOSink "minimumBy" Ops.minimumBy
130 , benchIOSink "sum" Ops.sum
131 , benchIOSink "product" Ops.product
132 ]
133 , bgroup "transformation"
134 [ benchIOSink "scan" (Ops.scan 1)
135 , benchIOSink "scanl1'" (Ops.scanl1' 1)
136 , benchIOSink "map" (Ops.map 1)
137 , benchIOSink "fmap" (Ops.fmap 1)
138 , benchIOSink "mapM" (Ops.mapM serially 1)
139 , benchIOSink "mapMaybe" (Ops.mapMaybe 1)
140 , benchIOSink "mapMaybeM" (Ops.mapMaybeM 1)
141 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
142 Ops.sequence serially (Ops.sourceUnfoldrMAction n)
143 , benchIOSink "findIndices" (Ops.findIndices 1)
144 , benchIOSink "elemIndices" (Ops.elemIndices 1)
145 ]
146 , bgroup "transformationX4"
147 [ benchIOSink "scan" (Ops.scan 4)
148 , benchIOSink "scanl1'" (Ops.scanl1' 4)
149 , benchIOSink "map" (Ops.map 4)
150 , benchIOSink "fmap" (Ops.fmap 4)
151 , benchIOSink "mapM" (Ops.mapM serially 4)
152 , benchIOSink "mapMaybe" (Ops.mapMaybe 4)
153 , benchIOSink "mapMaybeM" (Ops.mapMaybeM 4)
154 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
155 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
156 , benchIOSink "findIndices" (Ops.findIndices 4)
157 , benchIOSink "elemIndices" (Ops.elemIndices 4)
158 ]
159 , bgroup "filtering"
160 [ benchIOSink "filter-even" (Ops.filterEven 1)
161 , benchIOSink "filter-all-out" (Ops.filterAllOut 1)
162 , benchIOSink "filter-all-in" (Ops.filterAllIn 1)
163 , benchIOSink "take-all" (Ops.takeAll 1)
164 , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 1)
165 --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
166 , benchIOSink "drop-one" (Ops.dropOne 1)
167 , benchIOSink "drop-all" (Ops.dropAll 1)
168 , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 1)
169 --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
170 , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 1)
171 , benchIOSink "deleteBy" (Ops.deleteBy 1)
172 , benchIOSink "insertBy" (Ops.insertBy 1)
173 ]
174 , bgroup "filteringX4"
175 [ benchIOSink "filter-even" (Ops.filterEven 4)
176 , benchIOSink "filter-all-out" (Ops.filterAllOut 4)
177 , benchIOSink "filter-all-in" (Ops.filterAllIn 4)
178 , benchIOSink "take-all" (Ops.takeAll 4)
179 , benchIOSink "takeWhile-true" (Ops.takeWhileTrue 4)
180 --, benchIOSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
181 , benchIOSink "drop-one" (Ops.dropOne 4)
182 , benchIOSink "drop-all" (Ops.dropAll 4)
183 , benchIOSink "dropWhile-true" (Ops.dropWhileTrue 4)
184 --, benchIOSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
185 , benchIOSink "dropWhile-false" (Ops.dropWhileFalse 4)
186 , benchIOSink "deleteBy" (Ops.deleteBy 4)
187 , benchIOSink "insertBy" (Ops.insertBy 4)
188 ]
189 , bgroup "multi-stream"
190 [ benchIOSink "eqBy" Ops.eqBy
191 , benchIOSink "cmpBy" Ops.cmpBy
192 , benchIOSink "zip" Ops.zip
193 , benchIOSink "zipM" Ops.zipM
194 , benchIOSink "mergeBy" Ops.mergeBy
195 , benchIOSink "isPrefixOf" Ops.isPrefixOf
196 , benchIOSink "isSubsequenceOf" Ops.isSubsequenceOf
197 , benchIOSink "stripPrefix" Ops.stripPrefix
198 , benchIOSrc serially "concatMap" Ops.concatMap
199 ]
200 , bgroup "mixed"
201 [ benchIOSink "sum-product-fold" Ops.sumProductFold
202 , benchIOSink "sum-product-scan" Ops.sumProductScan
203 ]
204 , bgroup "mixedX4"
205 [ benchIOSink "scan-map" (Ops.scanMap 4)
206 , benchIOSink "drop-map" (Ops.dropMap 4)
207 , benchIOSink "drop-scan" (Ops.dropScan 4)
208 , benchIOSink "take-drop" (Ops.takeDrop 4)
209 , benchIOSink "take-scan" (Ops.takeScan 4)
210 , benchIOSink "take-map" (Ops.takeMap 4)
211 , benchIOSink "filter-drop" (Ops.filterDrop 4)
212 , benchIOSink "filter-take" (Ops.filterTake 4)
213 , benchIOSink "filter-scan" (Ops.filterScan 4)
214 , benchIOSink "filter-scanl1" (Ops.filterScanl1 4)
215 , benchIOSink "filter-map" (Ops.filterMap 4)
216 ]
217 , bgroup "iterated"
218 [ benchIOSrc serially "mapM" Ops.iterateMapM
219 , benchIOSrc serially "scan(1/100)" Ops.iterateScan
220 , benchIOSrc serially "scanl1(1/100)" Ops.iterateScanl1
221 , benchIOSrc serially "filterEven" Ops.iterateFilterEven
222 , benchIOSrc serially "takeAll" Ops.iterateTakeAll
223 , benchIOSrc serially "dropOne" Ops.iterateDropOne
224 , benchIOSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
225 , benchIOSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
226 ]
227 ]
228 ]