@@ -0,0 +1,188 @@
3+-------------------------------------------------------------------------------
5+-------------------------------------------------------------------------------
8+benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
9+benchIO name src f = bench name $ nfIO $
10+ randomRIO (1,1) >>= src >>= return . f
12+{-# INLINE benchPureSink #-}
13+benchPureSink :: NFData b => Int -> String -> (Stream Int -> b) -> Benchmark
14+benchPureSink value name f = benchIO name (sourceIntFromTo value) f
16+{-# INLINE benchIO' #-}
17+benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
18+benchIO' name src f = bench name $ nfIO $
19+ randomRIO (1,1) >>= src >>= f
21+{-# INLINE benchIOSink #-}
22+benchIOSink :: NFData b => Int -> String -> (Stream Int -> IO b) -> Benchmark
23+benchIOSink value name f = benchIO' name (sourceIntFromTo value) f
25+-------------------------------------------------------------------------------
27+-------------------------------------------------------------------------------
29+{-# INLINE sourceUnfoldr #-}
30+sourceUnfoldr :: MonadIO m => Int -> Int -> m (Stream Int)
31+sourceUnfoldr value n = S.fold (A.writeN value) $ S.unfoldr step n
36+ else (Just (cnt, cnt + 1))
38+{-# INLINE sourceIntFromTo #-}
39+sourceIntFromTo :: MonadIO m => Int -> Int -> m (Stream Int)
40+sourceIntFromTo value n = S.fold (A.writeN value) $ S.enumerateFromTo n (n + value)
42+{-# INLINE sourceFromList #-}
43+sourceFromList :: MonadIO m => Int -> Int -> m (Stream Int)
44+sourceFromList 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
62+{-# INLINE scanl1' #-}
66+ :: MonadIO m => Int -> Int -> Stream Int -> m (Stream Int)
69+{-# INLINE onArray #-}
71+ :: MonadIO m => Int -> (S.SerialT m Int -> S.SerialT m Int)
74+onArray value f arr = S.fold (A.writeN value) $ f $ (S.unfold A.read arr)
76+scanl' value n = composeN n $ onArray value $ S.scanl' (+) 0
77+scanl1' value n = composeN n $ onArray value $ S.scanl1' (+)
78+map value n = composeN n $ onArray value $ S.map (+1)
79+-- map n = composeN n $ A.map (+1)
81+{-# INLINE eqInstance #-}
82+eqInstance :: Stream Int -> Bool
83+eqInstance src = src == src
85+{-# INLINE eqInstanceNotEq #-}
86+eqInstanceNotEq :: Stream Int -> Bool
87+eqInstanceNotEq src = src P./= src
89+{-# INLINE ordInstance #-}
90+ordInstance :: Stream Int -> Bool
91+ordInstance src = src P.< src
93+{-# INLINE ordInstanceMin #-}
94+ordInstanceMin :: Stream Int -> Stream Int
95+ordInstanceMin src = P.min src src
97+{-# INLINE showInstance #-}
98+showInstance :: Stream Int -> P.String
99+showInstance src = P.show src
101+{-# INLINE pureFoldl' #-}
102+pureFoldl' :: MonadIO m => Stream Int -> m Int
103+pureFoldl' = S.foldl' (+) 0 . S.unfold A.read
106+-------------------------------------------------------------------------------
108+-------------------------------------------------------------------------------
110+{-# INLINE unfoldReadDrain #-}
111+unfoldReadDrain :: MonadIO m => Stream Int -> m ()
112+unfoldReadDrain = S.drain . S.unfold A.read
114+{-# INLINE toStreamRevDrain #-}
115+toStreamRevDrain :: MonadIO m => Stream Int -> m ()
116+toStreamRevDrain = S.drain . A.toStreamRev
118+-------------------------------------------------------------------------------
120+-------------------------------------------------------------------------------
122+common_o_1_space_generation :: Int -> [Benchmark]
123+common_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
136+common_o_1_space_elimination :: Int -> [Benchmark]
137+common_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
150+common_o_n_heap_serial :: Int -> [Benchmark]
151+common_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)
160+common_o_1_space_transformation :: Int -> [Benchmark]
161+common_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)
169+common_o_1_space_transformationX4 :: Int -> [Benchmark]
170+common_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)
178+commonBenchmarks :: Int -> [Benchmark]
179+commonBenchmarks 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