on bf4e5d8 help sign in
streamly/benchmark/Linear.hs
162 lines 6.5 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)
9-- import Data.Functor.Identity (Identity, runIdentity)
10import System.Random (randomRIO)
11import qualified LinearOps as Ops
13import Streamly
14import Gauge
16-- 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.
18--
19-- | Takes a fold method, and uses it with a default source.
20{-# INLINE benchIO #-}
21benchIO :: (IsStream t, NFData b) => String -> (t IO Int -> IO b) -> Benchmark
22benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
24-- | Takes a source, and uses it with a default drain/fold method.
25{-# INLINE benchSrcIO #-}
26benchSrcIO
27 :: (t IO Int -> SerialT IO Int)
28 -> String
29 -> (Int -> t IO Int)
30 -> Benchmark
31benchSrcIO t name f
32 = bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
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-}
39main :: IO ()
40main =
41 defaultMain
42 [ bgroup "serially"
43 [ bgroup "generation"
44 [ -- 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
49 -- These are essentially cons and consM
50 , benchSrcIO serially "fromFoldable" Ops.sourceFromFoldable
51 , benchSrcIO serially "fromFoldableM" Ops.sourceFromFoldableM
52 -- These are essentially appends
53 , benchSrcIO serially "foldMapWith" Ops.sourceFoldMapWith
54 , benchSrcIO serially "foldMapWithM" Ops.sourceFoldMapWithM
55 ]
56 , 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'
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
85 ]
86 , 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)
93 , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
94 Ops.sequence serially (Ops.sourceUnfoldrMAction n)
95 , benchIO "findIndices" (Ops.findIndices 1)
96 , benchIO "elemIndices" (Ops.elemIndices 1)
97 -- , benchIO "concat" Ops.concat
98 ]
99 , 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)
106 -- , bench "sequence" $ nfIO $ randomRIO (1,1000) >>= \n ->
107 -- Ops.sequence serially (Ops.sourceUnfoldrMAction n)
108 , benchIO "findIndices" (Ops.findIndices 4)
109 , benchIO "elemIndices" (Ops.elemIndices 4)
110 -- , benchIO "concat" Ops.concat
111 ]
112 , 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)
124 ]
125 , 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)
137 ]
138 , benchIO "zip" Ops.zip
139 , benchIO "zipM" Ops.zipM
140 , 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)
151 ]
152 , 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
160 ]
161 ]
162 ]