4-- Copyright : (c) 2018 Harendra Kumar
7-- Maintainer : harendra.kumar@gmail.com
9import Control.DeepSeq (NFData(..), deepseq)
10import Data.Functor.Identity (Identity)
11import Foreign.Storable (Storable(..))
12import System.Random (randomRIO)
15import qualified GHC.Exts as GHC
17import qualified ArrayOps as Ops
18import qualified Streamly.Array as A
22-------------------------------------------------------------------------------
24-------------------------------------------------------------------------------
26{-# INLINE benchPure #-}
27benchPure :: NFData b => String -> (Int -> a) -> (a -> b) -> Benchmark
28benchPure name src f = bench name $ nfIO $
29 randomRIO (1,1) >>= return . f . src
31{-# INLINE benchPureSink #-}
32benchPureSink :: NFData b => String -> (Ops.Stream Int -> b) -> Benchmark
33benchPureSink name f = benchPure name Ops.sourceIntFromTo f
35{-# INLINE benchPureSrc #-}
36benchPureSrc :: (NFData a, Storable a)
37 => String -> (Int -> Ops.Stream a) -> Benchmark
38benchPureSrc name src = benchPure name src id
41mkString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
48 [ benchPureSrc "fromStreamN . intFromTo" Ops.sourceIntFromTo
49 , benchPureSrc "fromStream . intFromTo" Ops.sourceIntFromToFromStream
50 , benchPureSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
51 , benchPureSrc "fromStreamN . unfoldr" Ops.sourceUnfoldr
52 , benchPureSrc "fromStreamN . fromList" Ops.sourceFromList
53 , benchPureSrc "fromStreamN . IsList.fromList" Ops.sourceIsList
54 , benchPureSrc "fromStreamN . IsString.fromString" Ops.sourceIsString
55 , mkString `deepseq` (bench "read" $ nf Ops.readInstance mkString)
56 , benchPureSink "show" Ops.showInstance
58 , bgroup "elimination"
59 [ benchPureSink "id" id
60 -- , benchPureSink "eqBy" Ops.eqBy
61 , benchPureSink "==" Ops.eqInstance
62 , benchPureSink "/=" Ops.eqInstanceNotEq
64 , benchPureSink "cmpBy" Ops.cmpBy
66 , benchPureSink "<" Ops.ordInstance
67 , benchPureSink "min" Ops.ordInstanceMin
68 , benchPureSink "IsList.toList" GHC.toList
69 , benchPureSink "foldl'" Ops.pureFoldl'
70 , benchPureSink "toStream"
71 (A.toStream :: A.Array Int -> SerialT Identity Int)
72 , benchPureSink "toStreamRev"
73 (A.toStreamRev :: A.Array Int -> SerialT Identity Int)
75 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
76 , benchPureSink "foldable/sum" Ops.foldableSum
77 -- , benchPureSinkIO "traversable/mapM" Ops.traversableMapM
82 [ benchPureSink "uncons" Ops.uncons
83 , benchPureSink "toNull" $ Ops.toNull serially
84 , benchPureSink "mapM_" Ops.mapM_
86 , benchPureSink "init" Ops.init
87 , benchPureSink "tail" Ops.tail
88 , benchPureSink "nullHeadTail" Ops.nullHeadTail
90 -- this is too low and causes all benchmarks reported in ns
91 -- , benchPureSink "head" Ops.head
92 , benchPureSink "last" Ops.last
93 -- , benchPureSink "lookup" Ops.lookup
94 , benchPureSink "find" Ops.find
95 , benchPureSink "findIndex" Ops.findIndex
96 , benchPureSink "elemIndex" Ops.elemIndex
98 -- this is too low and causes all benchmarks reported in ns
99 -- , benchPureSink "null" Ops.null
100 , benchPureSink "elem" Ops.elem
101 , benchPureSink "notElem" Ops.notElem
102 , benchPureSink "all" Ops.all
103 , benchPureSink "any" Ops.any
104 , benchPureSink "and" Ops.and
105 , benchPureSink "or" Ops.or
107 , benchPureSink "length" Ops.length
108 , benchPureSink "sum" Ops.sum
109 , benchPureSink "product" Ops.product
111 , benchPureSink "maximumBy" Ops.maximumBy
112 , benchPureSink "maximum" Ops.maximum
113 , benchPureSink "minimumBy" Ops.minimumBy
114 , benchPureSink "minimum" Ops.minimum
116 , benchPureSink "toList" Ops.toList
117 , benchPureSink "toRevList" Ops.toRevList
120 , bgroup "transformation"
121 [ benchPureSink "scanl'" (Ops.scanl' 1)
122 , benchPureSink "scanl1'" (Ops.scanl1' 1)
123 , benchPureSink "map" (Ops.map 1)
125 , benchPureSink "fmap" (Ops.fmap 1)
126 , benchPureSink "mapM" (Ops.mapM serially 1)
127 , benchPureSink "mapMaybe" (Ops.mapMaybe 1)
128 , benchPureSink "mapMaybeM" (Ops.mapMaybeM 1)
129 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
130 Ops.sequence serially (Ops.sourceUnfoldrMAction n)
131 , benchPureSink "findIndices" (Ops.findIndices 1)
132 , benchPureSink "elemIndices" (Ops.elemIndices 1)
133 , benchPureSink "reverse" (Ops.reverse 1)
134 , benchPureSink "foldrS" (Ops.foldrS 1)
135 , benchPureSink "foldrSMap" (Ops.foldrSMap 1)
136 , benchPureSink "foldrT" (Ops.foldrT 1)
137 , benchPureSink "foldrTMap" (Ops.foldrTMap 1)
140 , bgroup "transformationX4"
141 [ benchPureSink "scanl'" (Ops.scanl' 4)
142 , benchPureSink "scanl1'" (Ops.scanl1' 4)
143 , benchPureSink "map" (Ops.map 4)
145 , benchPureSink "fmap" (Ops.fmap 4)
146 , benchPureSink "mapM" (Ops.mapM serially 4)
147 , benchPureSink "mapMaybe" (Ops.mapMaybe 4)
148 , benchPureSink "mapMaybeM" (Ops.mapMaybeM 4)
149 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
150 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
151 , benchPureSink "findIndices" (Ops.findIndices 4)
152 , benchPureSink "elemIndices" (Ops.elemIndices 4)
157 [ benchPureSink "filter-even" (Ops.filterEven 1)
158 , benchPureSink "filter-all-out" (Ops.filterAllOut 1)
159 , benchPureSink "filter-all-in" (Ops.filterAllIn 1)
160 , benchPureSink "take-all" (Ops.takeAll 1)
161 , benchPureSink "takeWhile-true" (Ops.takeWhileTrue 1)
162 --, benchPureSink "takeWhileM-true" (Ops.takeWhileMTrue 1)
163 , benchPureSink "drop-one" (Ops.dropOne 1)
164 , benchPureSink "drop-all" (Ops.dropAll 1)
165 , benchPureSink "dropWhile-true" (Ops.dropWhileTrue 1)
166 --, benchPureSink "dropWhileM-true" (Ops.dropWhileMTrue 1)
167 , benchPureSink "dropWhile-false" (Ops.dropWhileFalse 1)
168 , benchPureSink "deleteBy" (Ops.deleteBy 1)
169 , benchPureSink "insertBy" (Ops.insertBy 1)
171 , bgroup "filteringX4"
172 [ benchPureSink "filter-even" (Ops.filterEven 4)
173 , benchPureSink "filter-all-out" (Ops.filterAllOut 4)
174 , benchPureSink "filter-all-in" (Ops.filterAllIn 4)
175 , benchPureSink "take-all" (Ops.takeAll 4)
176 , benchPureSink "takeWhile-true" (Ops.takeWhileTrue 4)
177 --, benchPureSink "takeWhileM-true" (Ops.takeWhileMTrue 4)
178 , benchPureSink "drop-one" (Ops.dropOne 4)
179 , benchPureSink "drop-all" (Ops.dropAll 4)
180 , benchPureSink "dropWhile-true" (Ops.dropWhileTrue 4)
181 --, benchPureSink "dropWhileM-true" (Ops.dropWhileMTrue 4)
182 , benchPureSink "dropWhile-false" (Ops.dropWhileFalse 4)
183 , benchPureSink "deleteBy" (Ops.deleteBy 4)
184 , benchPureSink "insertBy" (Ops.insertBy 4)
186 , bgroup "multi-stream"
187 [ benchPureSink "eqBy" Ops.eqBy
188 , benchPureSink "cmpBy" Ops.cmpBy
189 , benchPureSink "zip" Ops.zip
190 , benchPureSink "zipM" Ops.zipM
191 , benchPureSink "mergeBy" Ops.mergeBy
192 , benchPureSink "isPrefixOf" Ops.isPrefixOf
193 , benchPureSink "isSubsequenceOf" Ops.isSubsequenceOf
194 , benchPureSink "stripPrefix" Ops.stripPrefix
195 , benchPureSrc serially "concatMap" Ops.concatMap
197 -- scanl-map and foldl-map are equivalent to the scan and fold in the foldl
198 -- library. If scan/fold followed by a map is efficient enough we may not
199 -- need monolithic implementations of these.
201 [ benchPureSink "scanl-map" (Ops.scanMap 1)
202 , benchPureSink "foldl-map" Ops.foldl'ReduceMap
203 , benchPureSink "sum-product-fold" Ops.sumProductFold
204 , benchPureSink "sum-product-scan" Ops.sumProductScan
207 [ benchPureSink "scan-map" (Ops.scanMap 4)
208 , benchPureSink "drop-map" (Ops.dropMap 4)
209 , benchPureSink "drop-scan" (Ops.dropScan 4)
210 , benchPureSink "take-drop" (Ops.takeDrop 4)
211 , benchPureSink "take-scan" (Ops.takeScan 4)
212 , benchPureSink "take-map" (Ops.takeMap 4)
213 , benchPureSink "filter-drop" (Ops.filterDrop 4)
214 , benchPureSink "filter-take" (Ops.filterTake 4)
215 , benchPureSink "filter-scan" (Ops.filterScan 4)
216 , benchPureSink "filter-scanl1" (Ops.filterScanl1 4)
217 , benchPureSink "filter-map" (Ops.filterMap 4)
220 [ benchPureSrc serially "mapM" Ops.iterateMapM
221 , benchPureSrc serially "scan(1/100)" Ops.iterateScan
222 , benchPureSrc serially "scanl1(1/100)" Ops.iterateScanl1
223 , benchPureSrc serially "filterEven" Ops.iterateFilterEven
224 , benchPureSrc serially "takeAll" Ops.iterateTakeAll
225 , benchPureSrc serially "dropOne" Ops.iterateDropOne
226 , benchPureSrc serially "dropWhileFalse" Ops.iterateDropWhileFalse
227 , benchPureSrc serially "dropWhileTrue" Ops.iterateDropWhileTrue
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list