on 81cf15b help sign in
streamly/benchmark/BaseStreams.hs
162 lines 7.4 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2018 Harendra Kumar
4--
5-- License : BSD3
6-- Maintainer : harendra.kumar@gmail.com
8{-# LANGUAGE CPP #-}
10import Control.DeepSeq (NFData)
11-- import Data.Functor.Identity (Identity, runIdentity)
12import System.Random (randomRIO)
14import Gauge
15import qualified StreamDOps as D
16import qualified StreamKOps as K
18-- We need a monadic bind here to make sure that the function f does not get
19-- completely optimized out by the compiler in some cases.
20{-# INLINE benchIO #-}
21benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
22benchIO name run f = bench name $ nfIO $ randomRIO (1,1000) >>= run . f
24benchFold :: NFData b
25 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
26benchFold name f src = bench name $ nfIO $ randomRIO (1,1000) >>= f . src
28{-
29_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
30_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
31-}
33main :: IO ()
34main =
35 defaultMain
36 [ bgroup "streamD"
37 [ bgroup "generation"
38 [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
39 , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
40 , benchIO "fromEnum" D.toNull D.sourceFromEnum
42 , benchIO "fromList" D.toNull D.sourceFromList
43 -- , benchIO "fromFoldableM" D.sourceFromFoldableM
44 ]
45 , bgroup "elimination"
46 [ benchIO "toNull" D.toNull D.sourceUnfoldrM
47 , benchIO "uncons" D.uncons D.sourceUnfoldrM
48 , benchFold "tail" D.tail D.sourceUnfoldrM
49 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
50 , benchIO "headTail" D.headTail D.sourceUnfoldrM
51 ]
52 , bgroup "transformation"
53 [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
54 , benchIO "map" (D.map 1) D.sourceUnfoldrM
55 , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
56 ]
57 , bgroup "transformationN"
58 [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
59 , benchIO "map" (D.map 4) D.sourceUnfoldrM
60 , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
61 ]
62 , bgroup "filtering"
63 [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
64 , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
65 , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
66 , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
67 , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
68 , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
69 , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
70 ]
71 , bgroup "filteringN"
72 [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
73 , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
74 , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
75 , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
76 , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
77 , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
78 , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
79 ]
80 , benchIO "zip" D.zip D.sourceUnfoldrM
81 , bgroup "composed"
82 [ benchIO "scan-map" (D.scanMap 4) D.sourceUnfoldrM
83 , benchIO "drop-map" (D.dropMap 4) D.sourceUnfoldrM
84 , benchIO "drop-scan" (D.dropScan 4) D.sourceUnfoldrM
85 , benchIO "take-drop" (D.takeDrop 4) D.sourceUnfoldrM
86 , benchIO "take-scan" (D.takeScan 4) D.sourceUnfoldrM
87 , benchIO "take-map" (D.takeMap 4) D.sourceUnfoldrM
88 , benchIO "filter-drop" (D.filterDrop 4) D.sourceUnfoldrM
89 , benchIO "filter-take" (D.filterTake 4) D.sourceUnfoldrM
90 , benchIO "filter-scan" (D.filterScan 4) D.sourceUnfoldrM
91 , benchIO "filter-map" (D.filterMap 4) D.sourceUnfoldrM
92 ]
93 ]
94 , bgroup "streamK"
95 [ bgroup "generation"
96 [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
97 , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
98 -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
100 , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
101 -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
103 -- appends
104 , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
105 , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
106 ]
107 , bgroup "elimination"
108 [ benchIO "toNull" K.toNull K.sourceUnfoldrM
109 , benchIO "uncons" K.uncons K.sourceUnfoldrM
110 , benchFold "init" K.init K.sourceUnfoldrM
111 , benchFold "tail" K.tail K.sourceUnfoldrM
112 , benchIO "nullTail" K.nullTail K.sourceUnfoldrM
113 , benchIO "headTail" K.headTail K.sourceUnfoldrM
114 , benchFold "toList" K.toList K.sourceUnfoldrM
115 , benchFold "fold" K.foldl K.sourceUnfoldrM
116 , benchFold "last" K.last K.sourceUnfoldrM
117 ]
118 , bgroup "transformation"
119 [ benchIO "scan" (K.scan 1) K.sourceUnfoldrM
120 , benchIO "map" (K.map 1) K.sourceUnfoldrM
121 , benchIO "mapM" (K.mapM 1) K.sourceUnfoldrM
122 -- , benchIO "concat" K.concat K.sourceUnfoldrM
123 ]
124 , bgroup "transformationN"
125 [ benchIO "scan" (K.scan 4) K.sourceUnfoldrM
126 , benchIO "map" (K.map 4) K.sourceUnfoldrM
127 , benchIO "mapM" (K.mapM 4) K.sourceUnfoldrM
128 -- , benchIO "concat" K.concat K.sourceUnfoldrM
129 ]
130 , bgroup "filtering"
131 [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
132 , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
133 , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
134 , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
135 , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
136 , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
137 , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
138 ]
139 , bgroup "filteringN"
140 [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
141 , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
142 , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
143 , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
144 , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
145 , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
146 , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
147 ]
148 , benchIO "zip" K.zip K.sourceUnfoldrM
149 , bgroup "composed"
150 [ benchIO "scan-map" (K.scanMap 4) K.sourceUnfoldrM
151 , benchIO "drop-map" (K.dropMap 4) K.sourceUnfoldrM
152 , benchIO "drop-scan" (K.dropScan 4) K.sourceUnfoldrM
153 , benchIO "take-drop" (K.takeDrop 4) K.sourceUnfoldrM
154 , benchIO "take-scan" (K.takeScan 4) K.sourceUnfoldrM
155 , benchIO "take-map" (K.takeMap 4) K.sourceUnfoldrM
156 , benchIO "filter-drop" (K.filterDrop 4) K.sourceUnfoldrM
157 , benchIO "filter-take" (K.filterTake 4) K.sourceUnfoldrM
158 , benchIO "filter-scan" (K.filterScan 4) K.sourceUnfoldrM
159 , benchIO "filter-map" (K.filterMap 4) K.sourceUnfoldrM
160 ]
161 ]
162 ]