@@ -32,26 +32,33 @@ sourceDescendingInt :: (Monad m, Stream.IsStream t) => Int -> Int -> t m Int
32sourceDescendingInt = sourceDescending
32sourceDescendingInt = sourceDescending
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
40 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
40 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
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
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
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 =
56+ $ randomRIO (1, 1 :: Int)
57+ >>= Stream.drain . Stream.postscan f . src len . fromIntegral
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
56{-# INLINE numElements #-}
63{-# INLINE numElements #-}
57numElements :: Int
64numElements :: Int
@@ -63,23 +70,29 @@ main =
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)
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)
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)"
92+ , benchWith sourceDescendingInt numElements
93+ "range descending (window size 1000)"
82− (Ring.slidingWindow 1000 Window.range)
94+ (Window.range 1000)
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 =
113− [ benchWithPostscan numElements "minimum (window size 100)"
126+ [ benchWithPostscan numElements "minimum (window size 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)
117− , benchWithPostscan numElements "maximum (window size 100)"
138+ , benchWithPostscan numElements "maximum (window size 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)
121− , benchWithPostscan numElements "range (window size 100)"
148+ , benchWithPostscan numElements "range (window size 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)"
154+ , benchScanWith sourceDescendingInt numElements
155+ "range descending (window size 1000)"
124− (Ring.slidingWindow 1000 Window.range)
156+ (Window.range 1000)
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)
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)
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))