on master help sign in
Add more scan benchmarks for Window folds
c5e0ee5Harendra Kumar
benchmark/Streamly/Benchmark/Data/Fold/Window.hs+63−24
@@ -32,26 +32,33 @@ sourceDescendingInt :: (Monad m, Stream.IsStream t) => Int -> Int -> t m Int
32sourceDescendingInt = sourceDescending
32sourceDescendingInt = sourceDescending
33
33
34{-# INLINE benchWith #-}
34{-# INLINE benchWith #-}
35−benchWith :: (Num a, NFData a) =>
35+benchWith :: (Num a, NFData b) =>
36− (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a a -> Benchmark
36+ (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a b -> Benchmark
37benchWith src len name f =
37benchWith src len name f =
38 bench name
38 bench name
39 $ nfIO
39 $ nfIO
40 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
40 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
41
41
42{-# INLINE benchWithFold #-}
42{-# INLINE benchWithFold #-}
43−benchWithFold :: Int -> String -> Fold IO Double Double -> Benchmark
43+benchWithFold :: NFData a => Int -> String -> Fold IO Double a -> Benchmark
44benchWithFold = benchWith source
44benchWithFold = benchWith source
45
45
46{-# INLINE benchWithFoldInt #-}
46{-# INLINE benchWithFoldInt #-}
47benchWithFoldInt :: Int -> String -> Fold IO Int Int -> Benchmark
47benchWithFoldInt :: Int -> String -> Fold IO Int Int -> Benchmark
48benchWithFoldInt = benchWith source
48benchWithFoldInt = benchWith source
49
49
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+
50{-# INLINE benchWithPostscan #-}
59{-# INLINE benchWithPostscan #-}
51−benchWithPostscan :: Int -> String -> Fold IO Double Double -> Benchmark
60+benchWithPostscan :: Int -> String -> Fold IO Double a -> Benchmark
52−benchWithPostscan len name f =
61+benchWithPostscan = benchScanWith source
53− bench name $ nfIO $ randomRIO (1, 1) >>=
54− Stream.drain . Stream.postscan f . source len
55
62
56{-# INLINE numElements #-}
63{-# INLINE numElements #-}
57numElements :: Int
64numElements :: Int
@@ -63,23 +70,29 @@ main =
63 [ bgroup
70 [ bgroup
64 "fold"
71 "fold"
65 [ benchWithFold numElements "minimum (window size 100)"
72 [ benchWithFold numElements "minimum (window size 100)"
66− (Ring.slidingWindow 100 Window.minimum)
73+ (Window.minimum 100)
67 , benchWithFold numElements "minimum (window size 1000)"
74 , benchWithFold numElements "minimum (window size 1000)"
68− (Ring.slidingWindow 1000 Window.minimum)
75+ (Window.minimum 1000)
69 , benchWith sourceDescendingInt numElements
76 , benchWith sourceDescendingInt numElements
70 "minimum descending (window size 1000)"
77 "minimum descending (window size 1000)"
71− (Ring.slidingWindow 1000 Window.minimum)
78+ (Window.minimum 1000)
79+
72 , benchWithFold numElements "maximum (window size 100)"
80 , benchWithFold numElements "maximum (window size 100)"
73− (Ring.slidingWindow 100 Window.maximum)
81+ (Window.maximum 100)
74 , benchWithFold numElements "maximum (window size 1000)"
82 , benchWithFold numElements "maximum (window size 1000)"
75− (Ring.slidingWindow 1000 Window.maximum)
83+ (Window.maximum 1000)
76 , benchWith sourceDescendingInt numElements
84 , benchWith sourceDescendingInt numElements
77 "maximum descending (window size 1000)"
85 "maximum descending (window size 1000)"
78− (Ring.slidingWindow 1000 Window.maximum)
86+ (Window.maximum 1000)
87+
79 , benchWithFold numElements "range (window size 100)"
88 , benchWithFold numElements "range (window size 100)"
80− (Ring.slidingWindow 100 Window.range)
89+ (Window.range 100)
81 , benchWithFold numElements "range (window size 1000)"
90 , benchWithFold numElements "range (window size 1000)"
91+ (Window.range 1000)
92+ , benchWith sourceDescendingInt numElements
93+ "range descending (window size 1000)"
82− (Ring.slidingWindow 1000 Window.range)
94+ (Window.range 1000)
95+
83 , benchWithFoldInt numElements "sumInt (window size 100)"
96 , benchWithFoldInt numElements "sumInt (window size 100)"
84 (Ring.slidingWindow 100 Window.sumInt)
97 (Ring.slidingWindow 100 Window.sumInt)
85 , benchWithFoldInt numElements "sum for Int (window size 100)"
98 , benchWithFoldInt numElements "sum for Int (window size 100)"
@@ -110,25 +123,51 @@ main =
110 ]
123 ]
111 , bgroup
124 , bgroup
112 "scan"
125 "scan"
113− [ benchWithPostscan numElements "minimum (window size 100)"
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)"
114− (Ring.slidingWindow 100 Window.minimum)
131+ (Window.minimum 30)
115 , benchWithPostscan numElements "minimum (window size 1000)"
132 , benchWithPostscan numElements "minimum (window size 1000)"
133+ (Window.minimum 1000)
134+ , benchScanWith sourceDescendingInt numElements
135+ "minimum descending (window size 1000)"
116− (Ring.slidingWindow 1000 Window.minimum)
136+ (Window.minimum 1000)
137+
117− , benchWithPostscan numElements "maximum (window size 100)"
138+ , benchWithPostscan numElements "maximum (window size 10)"
139+ (Window.maximum 10)
140+ , benchWithPostscan numElements "maximum (window size 30)"
118− (Ring.slidingWindow 100 Window.maximum)
141+ (Window.maximum 30)
119 , benchWithPostscan numElements "maximum (window size 1000)"
142 , benchWithPostscan numElements "maximum (window size 1000)"
143+ (Window.maximum 1000)
144+ , benchScanWith sourceDescendingInt numElements
145+ "maximum descending (window size 1000)"
120− (Ring.slidingWindow 1000 Window.maximum)
146+ (Window.maximum 1000)
147+
121− , benchWithPostscan numElements "range (window size 100)"
148+ , benchWithPostscan numElements "range (window size 10)"
149+ (Window.range 10)
150+ , benchWithPostscan numElements "range (window size 30)"
122− (Ring.slidingWindow 100 Window.range)
151+ (Window.range 30)
123 , benchWithPostscan numElements "range (window size 1000)"
152 , benchWithPostscan numElements "range (window size 1000)"
153+ (Window.range 1000)
154+ , benchScanWith sourceDescendingInt numElements
155+ "range descending (window size 1000)"
124− (Ring.slidingWindow 1000 Window.range)
156+ (Window.range 1000)
157+
125 , benchWithPostscan numElements "sum (window size 100)"
158 , benchWithPostscan numElements "sum (window size 100)"
126 (Ring.slidingWindow 100 Window.sum)
159 (Ring.slidingWindow 100 Window.sum)
127 , benchWithPostscan numElements "sum (window size 1000)"
160 , benchWithPostscan numElements "sum (window size 1000)"
128 (Ring.slidingWindow 1000 Window.sum)
161 (Ring.slidingWindow 1000 Window.sum)
162+
129 , benchWithPostscan numElements "mean (window size 100)"
163 , benchWithPostscan numElements "mean (window size 100)"
130 (Ring.slidingWindow 100 Window.mean)
164 (Ring.slidingWindow 100 Window.mean)
131 , benchWithPostscan numElements "mean (window size 1000)"
165 , benchWithPostscan numElements "mean (window size 1000)"
132 (Ring.slidingWindow 1000 Window.mean)
166 (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))
133 ]
172 ]
134 ]
173 ]