on master help sign in
Add more scan benchmarks for Window folds
commitc5e0ee5a0c46d1a30de815344423486e3fc7eaca authorHarendra Kumar <harendra@composewell.com> dateTue 7 Jun 2022, 16:12 (4 years ago) parentd36f02f
1 file changed+63−24
benchmark/Streamly/Benchmark/Data/Fold/Window.hs+63−24
benchmark/Streamly/Benchmark/Data/Fold/Window.hs+63−24
@@ -32,26 +32,33 @@ sourceDescendingInt :: (Monad m, Stream.IsStream t) => Int -> Int -> t m Int
3232sourceDescendingInt = sourceDescending
3333
3434{-# INLINE benchWith #-}
35−benchWith :: (Num a, NFData a) =>
36− (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a a -> Benchmark
35+benchWith :: (Num a, NFData b) =>
36+ (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a b -> Benchmark
3737benchWith src len name f =
3838 bench name
3939 $ nfIO
4040 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
4141
4242{-# INLINE benchWithFold #-}
43−benchWithFold :: Int -> String -> Fold IO Double Double -> Benchmark
43+benchWithFold :: NFData a => Int -> String -> Fold IO Double a -> Benchmark
4444benchWithFold = benchWith source
4545
4646{-# INLINE benchWithFoldInt #-}
4747benchWithFoldInt :: Int -> String -> Fold IO Int Int -> Benchmark
4848benchWithFoldInt = benchWith source
4949
50+{-# INLINE benchScanWith #-}
51+benchScanWith :: Num a =>
52+ (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a b -> Benchmark
53+benchScanWith src len name f =
54+ bench name
55+ $ nfIO
56+ $ randomRIO (1, 1 :: Int)
57+ >>= Stream.drain . Stream.postscan f . src len . fromIntegral
58+
5059{-# INLINE benchWithPostscan #-}
51−benchWithPostscan :: Int -> String -> Fold IO Double Double -> Benchmark
52−benchWithPostscan len name f =
53− bench name $ nfIO $ randomRIO (1, 1) >>=
54− Stream.drain . Stream.postscan f . source len
60+benchWithPostscan :: Int -> String -> Fold IO Double a -> Benchmark
61+benchWithPostscan = benchScanWith source
5562
5663{-# INLINE numElements #-}
5764numElements :: Int
@@ -63,23 +70,29 @@ main =
6370 [ bgroup
6471 "fold"
6572 [ benchWithFold numElements "minimum (window size 100)"
66− (Ring.slidingWindow 100 Window.minimum)
73+ (Window.minimum 100)
6774 , benchWithFold numElements "minimum (window size 1000)"
68− (Ring.slidingWindow 1000 Window.minimum)
75+ (Window.minimum 1000)
6976 , benchWith sourceDescendingInt numElements
7077 "minimum descending (window size 1000)"
71− (Ring.slidingWindow 1000 Window.minimum)
78+ (Window.minimum 1000)
79+
7280 , benchWithFold numElements "maximum (window size 100)"
73− (Ring.slidingWindow 100 Window.maximum)
81+ (Window.maximum 100)
7482 , benchWithFold numElements "maximum (window size 1000)"
75− (Ring.slidingWindow 1000 Window.maximum)
83+ (Window.maximum 1000)
7684 , benchWith sourceDescendingInt numElements
7785 "maximum descending (window size 1000)"
78− (Ring.slidingWindow 1000 Window.maximum)
86+ (Window.maximum 1000)
87+
7988 , benchWithFold numElements "range (window size 100)"
80− (Ring.slidingWindow 100 Window.range)
89+ (Window.range 100)
8190 , benchWithFold numElements "range (window size 1000)"
82− (Ring.slidingWindow 1000 Window.range)
91+ (Window.range 1000)
92+ , benchWith sourceDescendingInt numElements
93+ "range descending (window size 1000)"
94+ (Window.range 1000)
95+
8396 , benchWithFoldInt numElements "sumInt (window size 100)"
8497 (Ring.slidingWindow 100 Window.sumInt)
8598 , benchWithFoldInt numElements "sum for Int (window size 100)"
@@ -110,25 +123,51 @@ main =
110123 ]
111124 , bgroup
112125 "scan"
113− [ benchWithPostscan numElements "minimum (window size 100)"
114− (Ring.slidingWindow 100 Window.minimum)
126+ [ benchWithPostscan numElements "minimum (window size 10)"
127+ (Window.minimum 10)
128+ -- Below window size 30 the linear search based impl performs better
129+ -- than the dequeue based implementation.
130+ , benchWithPostscan numElements "minimum (window size 30)"
131+ (Window.minimum 30)
115132 , benchWithPostscan numElements "minimum (window size 1000)"
116− (Ring.slidingWindow 1000 Window.minimum)
117− , benchWithPostscan numElements "maximum (window size 100)"
118− (Ring.slidingWindow 100 Window.maximum)
133+ (Window.minimum 1000)
134+ , benchScanWith sourceDescendingInt numElements
135+ "minimum descending (window size 1000)"
136+ (Window.minimum 1000)
137+
138+ , benchWithPostscan numElements "maximum (window size 10)"
139+ (Window.maximum 10)
140+ , benchWithPostscan numElements "maximum (window size 30)"
141+ (Window.maximum 30)
119142 , benchWithPostscan numElements "maximum (window size 1000)"
120− (Ring.slidingWindow 1000 Window.maximum)
121− , benchWithPostscan numElements "range (window size 100)"
122− (Ring.slidingWindow 100 Window.range)
143+ (Window.maximum 1000)
144+ , benchScanWith sourceDescendingInt numElements
145+ "maximum descending (window size 1000)"
146+ (Window.maximum 1000)
147+
148+ , benchWithPostscan numElements "range (window size 10)"
149+ (Window.range 10)
150+ , benchWithPostscan numElements "range (window size 30)"
151+ (Window.range 30)
123152 , benchWithPostscan numElements "range (window size 1000)"
124− (Ring.slidingWindow 1000 Window.range)
153+ (Window.range 1000)
154+ , benchScanWith sourceDescendingInt numElements
155+ "range descending (window size 1000)"
156+ (Window.range 1000)
157+
125158 , benchWithPostscan numElements "sum (window size 100)"
126159 (Ring.slidingWindow 100 Window.sum)
127160 , benchWithPostscan numElements "sum (window size 1000)"
128161 (Ring.slidingWindow 1000 Window.sum)
162+
129163 , benchWithPostscan numElements "mean (window size 100)"
130164 (Ring.slidingWindow 100 Window.mean)
131165 , benchWithPostscan numElements "mean (window size 1000)"
132166 (Ring.slidingWindow 1000 Window.mean)
167+
168+ , benchWithPostscan numElements "powerSum 2 (window size 100)"
169+ (Ring.slidingWindow 100 (Window.powerSum 2))
170+ , benchWithPostscan numElements "powerSum 2 (window size 1000)"
171+ (Ring.slidingWindow 1000 (Window.powerSum 2))
133172 ]
134173 ]