on 4e604ef help sign in
134 lines 5.4 kB history raw
1module Main (main) where
3import Control.DeepSeq (NFData)
4import Streamly.Data.Fold (Fold)
5import Streamly.Prelude (SerialT)
6import System.Random (randomRIO)
8import qualified Streamly.Data.Fold as Fold
9import qualified Streamly.Internal.Data.Ring.Foreign as Ring
10import qualified Streamly.Prelude as Stream
11import qualified Streamly.Internal.Data.Fold.Window as Window
13import Gauge
15{-# INLINE source #-}
16source :: (Monad m, Stream.IsStream t, Num a, Stream.Enumerable a) =>
17 Int -> a -> t m a
18source len from =
19 Stream.enumerateFromThenTo from (from + 1) (from + fromIntegral len)
21{-# INLINE sourceDescending #-}
22sourceDescending :: (Monad m, Stream.IsStream t, Num a, Stream.Enumerable a) =>
23 Int -> a -> t m a
24sourceDescending len from =
25 Stream.enumerateFromThenTo
26 (from + fromIntegral len)
27 (from + fromIntegral (len - 1))
28 from
30{-# INLINE sourceDescendingInt #-}
31sourceDescendingInt :: (Monad m, Stream.IsStream t) => Int -> Int -> t m Int
32sourceDescendingInt = sourceDescending
34{-# INLINE benchWith #-}
35benchWith :: (Num a, NFData a) =>
36 (Int -> a -> SerialT IO a) -> Int -> String -> Fold IO a a -> Benchmark
37benchWith src len name f =
38 bench name
39 $ nfIO
40 $ randomRIO (1, 1 :: Int) >>= Stream.fold f . src len . fromIntegral
42{-# INLINE benchWithFold #-}
43benchWithFold :: Int -> String -> Fold IO Double Double -> Benchmark
44benchWithFold = benchWith source
46{-# INLINE benchWithFoldInt #-}
47benchWithFoldInt :: Int -> String -> Fold IO Int Int -> Benchmark
48benchWithFoldInt = benchWith source
50{-# INLINE benchWithPostscan #-}
51benchWithPostscan :: Int -> String -> Fold IO Double Double -> Benchmark
52benchWithPostscan len name f =
53 bench name $ nfIO $ randomRIO (1, 1) >>=
54 Stream.drain . Stream.postscan f . source len
56{-# INLINE numElements #-}
57numElements :: Int
58numElements = 100000
60main :: IO ()
61main =
62 defaultMain
63 [ bgroup
64 "fold"
65 [ benchWithFold numElements "minimum (window size 100)"
66 (Ring.slidingWindow 100 Window.minimum)
67 , benchWithFold numElements "minimum (window size 1000)"
68 (Ring.slidingWindow 1000 Window.minimum)
69 , benchWith sourceDescendingInt numElements
70 "minimum descending (window size 1000)"
71 (Ring.slidingWindow 1000 Window.minimum)
72 , benchWithFold numElements "maximum (window size 100)"
73 (Ring.slidingWindow 100 Window.maximum)
74 , benchWithFold numElements "maximum (window size 1000)"
75 (Ring.slidingWindow 1000 Window.maximum)
76 , benchWith sourceDescendingInt numElements
77 "maximum descending (window size 1000)"
78 (Ring.slidingWindow 1000 Window.maximum)
79 , benchWithFold numElements "range (window size 100)"
80 (Ring.slidingWindow 100 Window.range)
81 , benchWithFold numElements "range (window size 1000)"
82 (Ring.slidingWindow 1000 Window.range)
83 , benchWithFoldInt numElements "sumInt (window size 100)"
84 (Ring.slidingWindow 100 Window.sumInt)
85 , benchWithFoldInt numElements "sum for Int (window size 100)"
86 (Ring.slidingWindow 100 Window.sum)
87 , benchWithFold numElements "sum (window size 100)"
88 (Ring.slidingWindow 100 Window.sum)
89 , benchWithFold numElements "sum (window size 1000)"
90 (Ring.slidingWindow 1000 Window.sum)
91 , benchWithFold numElements "sum (entire stream)"
92 (Window.cumulative Window.sum)
93 , benchWithFold numElements "sum (Data.Fold)"
94 Fold.sum
96 , benchWithFold numElements "mean (window size 100)"
97 (Ring.slidingWindow 100 Window.mean)
98 , benchWithFold numElements "mean (window size 1000)"
99 (Ring.slidingWindow 1000 Window.mean)
100 , benchWithFold numElements "mean (entire stream)"
101 (Window.cumulative Window.mean)
102 , benchWithFold numElements "mean (Data.Fold)"
103 Fold.mean
105 , benchWithFold numElements "powerSum 2 (window size 100)"
106 (Ring.slidingWindow 100 (Window.powerSum 2))
107 , benchWithFold numElements "powerSum 2 (entire stream)"
108 (Window.cumulative (Window.powerSum 2))
110 ]
111 , bgroup
112 "scan"
113 [ benchWithPostscan numElements "minimum (window size 100)"
114 (Ring.slidingWindow 100 Window.minimum)
115 , 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)
119 , 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)
123 , benchWithPostscan numElements "range (window size 1000)"
124 (Ring.slidingWindow 1000 Window.range)
125 , benchWithPostscan numElements "sum (window size 100)"
126 (Ring.slidingWindow 100 Window.sum)
127 , benchWithPostscan numElements "sum (window size 1000)"
128 (Ring.slidingWindow 1000 Window.sum)
129 , benchWithPostscan numElements "mean (window size 100)"
130 (Ring.slidingWindow 100 Window.mean)
131 , benchWithPostscan numElements "mean (window size 1000)"
132 (Ring.slidingWindow 1000 Window.mean)
133 ]
134 ]