3-------------------------------------------------------------------------------
5-------------------------------------------------------------------------------
8benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
9benchIO name src f = bench name $ nfIO $
10 (randomRIO (1,1) >>= src) <&> f
12{-# INLINE benchPureSink #-}
13benchPureSink :: NFData b => Int -> String -> (Stream Int -> b) -> Benchmark
14benchPureSink value name = benchIO name (sourceIntFromTo value)
16{-# INLINE benchIO' #-}
17benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
18benchIO' name src f = bench name $ nfIO $
19 randomRIO (1,1) >>= src >>= f
21{-# INLINE benchIOSink #-}
22benchIOSink :: NFData b => Int -> String -> (Stream Int -> IO b) -> Benchmark
23benchIOSink value name = benchIO' name (sourceIntFromTo value)
25-------------------------------------------------------------------------------
27-------------------------------------------------------------------------------
29{-# INLINE sourceUnfoldr #-}
30sourceUnfoldr :: MonadIO m => Int -> Int -> m (Stream Int)
31sourceUnfoldr value n = S.fold (A.writeN value) $ S.unfoldr step n
36 else Just (cnt, cnt + 1)
38{-# INLINE sourceIntFromTo #-}
39sourceIntFromTo :: MonadIO m => Int -> Int -> m (Stream Int)
40sourceIntFromTo value n = S.fold (A.writeN value) $ S.enumerateFromTo n (n + value)
42{-# INLINE sourceFromList #-}
43sourceFromList :: MonadIO m => Int -> Int -> m (Stream Int)
44sourceFromList value n = S.fold (A.writeN value) $ S.fromList [n..n+value]
46-------------------------------------------------------------------------------
48-------------------------------------------------------------------------------
50{-# INLINE composeN #-}
52 => Int -> (Stream Int -> m (Stream Int)) -> Stream Int -> m (Stream Int)
57 3 -> f x P.>>= f P.>>= f
58 4 -> f x P.>>= f P.>>= f P.>>= f
66 :: MonadIO m => Int -> Int -> Stream Int -> m (Stream Int)
71 :: MonadIO m => Int -> (S.SerialT m Int -> S.SerialT m Int)
74onArray value f arr = S.fold (A.writeN value) $ f $ S.unfold A.read arr
76scanl' value n = composeN n $ onArray value $ S.scanl' (+) 0
77scanl1' value n = composeN n $ onArray value $ S.scanl1' (+)
78map value n = composeN n $ onArray value $ S.map (+1)
79-- map n = composeN n $ A.map (+1)
81{-# INLINE eqInstance #-}
82eqInstance :: Stream Int -> Bool
83eqInstance src = src == src
85{-# INLINE eqInstanceNotEq #-}
86eqInstanceNotEq :: Stream Int -> Bool
87eqInstanceNotEq src = src P./= src
89{-# INLINE ordInstance #-}
90ordInstance :: Stream Int -> Bool
91ordInstance src = src P.< src
93{-# INLINE ordInstanceMin #-}
94ordInstanceMin :: Stream Int -> Stream Int
95ordInstanceMin src = P.min src src
97{-# INLINE showInstance #-}
98showInstance :: Stream Int -> P.String
101{-# INLINE pureFoldl' #-}
102pureFoldl' :: MonadIO m => Stream Int -> m Int
103pureFoldl' = S.foldl' (+) 0 . S.unfold A.read
106-------------------------------------------------------------------------------
108-------------------------------------------------------------------------------
110{-# INLINE unfoldReadDrain #-}
111unfoldReadDrain :: MonadIO m => Stream Int -> m ()
112unfoldReadDrain = S.drain . S.unfold A.read
114{-# INLINE toStreamRevDrain #-}
115toStreamRevDrain :: MonadIO m => Stream Int -> m ()
116toStreamRevDrain = S.drain . A.toStreamRev
118-------------------------------------------------------------------------------
120-------------------------------------------------------------------------------
122common_o_1_space_generation :: Int -> [Benchmark]
123common_o_1_space_generation value =
126 [ benchIOSrc "writeN . intFromTo" (sourceIntFromTo value)
128 "fromList . intFromTo"
129 (sourceIntFromToFromList value)
130 , benchIOSrc "writeN . unfoldr" (sourceUnfoldr value)
131 , benchIOSrc "writeN . fromList" (sourceFromList value)
132 , benchPureSink value "show" showInstance
136common_o_1_space_elimination :: Int -> [Benchmark]
137common_o_1_space_elimination value =
138 [ bgroup "elimination"
139 [ benchPureSink value "id" id
140 , benchPureSink value "==" eqInstance
141 , benchPureSink value "/=" eqInstanceNotEq
142 , benchPureSink value "<" ordInstance
143 , benchPureSink value "min" ordInstanceMin
144 , benchIOSink value "foldl'" pureFoldl'
145 , benchIOSink value "read" unfoldReadDrain
146 , benchIOSink value "toStreamRev" toStreamRevDrain
150common_o_n_heap_serial :: Int -> [Benchmark]
151common_o_n_heap_serial value =
152 [ bgroup "elimination"
154 -- Converting the stream to an array
155 benchFold "writeN" (S.fold (A.writeN value))
156 (P.sourceUnfoldrM value)
160common_o_1_space_transformation :: Int -> [Benchmark]
161common_o_1_space_transformation value =
162 [ bgroup "transformation"
163 [ benchIOSink value "scanl'" (scanl' value 1)
164 , benchIOSink value "scanl1'" (scanl1' value 1)
165 , benchIOSink value "map" (map value 1)
169common_o_1_space_transformationX4 :: Int -> [Benchmark]
170common_o_1_space_transformationX4 value =
171 [ bgroup "transformationX4"
172 [ benchIOSink value "scanl'" (scanl' value 4)
173 , benchIOSink value "scanl1'" (scanl1' value 4)
174 , benchIOSink value "map" (map value 4)
178commonBenchmarks :: Int -> [Benchmark]
179commonBenchmarks size =
180 [ bgroup (o_1_space_prefix moduleName) $ concat
181 [ common_o_1_space_generation size
182 , common_o_1_space_elimination size
183 , common_o_1_space_transformation size
184 , common_o_1_space_transformationX4 size
186 , bgroup (o_n_space_prefix moduleName) $
187 common_o_n_heap_serial size
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