on f700973 help sign in
196 lines 6.4 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2020 Composewell Technologies
4--
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
8{-# LANGUAGE CPP #-}
9{-# LANGUAGE FlexibleContexts #-}
11import Control.DeepSeq (NFData(..))
12import System.Random (randomRIO)
14import qualified Streamly.Benchmark.Data.ArrayOps as Ops
15import qualified Streamly.Data.Array.Foreign as A
16import qualified Streamly.Internal.Data.Array.Foreign as IA
17import qualified Streamly.Prelude as S
19import Gauge
20import Streamly.Benchmark.Common hiding (benchPureSrc)
21import qualified Streamly.Benchmark.Prelude as P
23#ifdef MEMORY_ARRAY
24import qualified GHC.Exts as GHC
25#endif
27#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
28import Control.DeepSeq (deepseq)
29#endif
31-------------------------------------------------------------------------------
32--
33-------------------------------------------------------------------------------
35#ifdef MEMORY_ARRAY
36-- Drain a source that generates a pure array
37{-# INLINE benchPureSrc #-}
38benchPureSrc :: String -> (Int -> Ops.Stream a) -> Benchmark
39benchPureSrc name src = benchPure name src id
40#endif
42{-# INLINE benchIO #-}
43benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
44benchIO name src f = bench name $ nfIO $
45 randomRIO (1,1) >>= src >>= return . f
47-- Drain a source that generates an array in the IO monad
48{-# INLINE benchIOSrc #-}
49benchIOSrc ::
50#if !defined(DATA_ARRAY_PRIM) \
51 && !defined(DATA_ARRAY_PRIM_PINNED) \
52 && !defined(MEMORY_ARRAY)
53 NFData a =>
54#endif
55 String -> (Int -> IO (Ops.Stream a)) -> Benchmark
56benchIOSrc name src = benchIO name src id
58{-# INLINE benchPureSink #-}
59benchPureSink :: NFData b => Int -> String -> (Ops.Stream Int -> b) -> Benchmark
60benchPureSink value name f = benchIO name (Ops.sourceIntFromTo value) f
62{-# INLINE benchIO' #-}
63benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
64benchIO' name src f = bench name $ nfIO $
65 randomRIO (1,1) >>= src >>= f
67{-# INLINE benchIOSink #-}
68benchIOSink :: NFData b => Int -> String -> (Ops.Stream Int -> IO b) -> Benchmark
69benchIOSink value name f = benchIO' name (Ops.sourceIntFromTo value) f
71o_1_space_generation :: Int -> [Benchmark]
72o_1_space_generation value =
73 [ bgroup
74 "generation"
75 [ benchIOSrc "writeN . intFromTo" (Ops.sourceIntFromTo value)
76#ifndef DATA_SMALLARRAY
77 , benchIOSrc "write . intFromTo" (Ops.sourceIntFromToFromStream value)
78#endif
79 , benchIOSrc
80 "fromList . intFromTo"
81 (Ops.sourceIntFromToFromList value)
82 , benchIOSrc "writeN . unfoldr" (Ops.sourceUnfoldr value)
83 , benchIOSrc "writeN . fromList" (Ops.sourceFromList value)
84#ifdef MEMORY_ARRAY
85 , benchPureSrc "writeN . IsList.fromList" (Ops.sourceIsList value)
86 , benchPureSrc
87 "writeN . IsString.fromString"
88 (Ops.sourceIsString value)
89#endif
90#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
91#ifdef DATA_SMALLARRAY
92 , let testStr =
93 "fromListN " ++
94 show (value + 1) ++
95 "[1" ++ concat (replicate value ",1") ++ "]"
96#else
97 , let testStr = mkListString value
98#endif
99 in testStr `deepseq` (bench "read" $ nf Ops.readInstance testStr)
100#endif
101 , benchPureSink value "show" Ops.showInstance
102 ]
103 ]
105o_1_space_elimination :: Int -> [Benchmark]
106o_1_space_elimination value =
107 [ bgroup "elimination"
108 [ benchPureSink value "id" id
109 , benchPureSink value "==" Ops.eqInstance
110 , benchPureSink value "/=" Ops.eqInstanceNotEq
111 , benchPureSink value "<" Ops.ordInstance
112 , benchPureSink value "min" Ops.ordInstanceMin
113#ifdef MEMORY_ARRAY
114 -- length is used to check for foldr/build fusion
115 , benchPureSink value "length . IsList.toList" (length . GHC.toList)
116#endif
117 , benchIOSink value "foldl'" Ops.pureFoldl'
118 , benchIOSink value "read" Ops.unfoldReadDrain
119 , benchIOSink value "toStreamRev" Ops.toStreamRevDrain
120 , benchFold "writeLastN.1" (S.fold (IA.writeLastN 1)) (P.sourceUnfoldrM value)
121 , benchFold "writeLastN.10" (S.fold (IA.writeLastN 10)) (P.sourceUnfoldrM value)
122#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
123#ifdef DEVBUILD
124 , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
125 , benchPureSink value "foldable/sum" Ops.foldableSum
126#endif
127#endif
128 ]
129 ]
131o_n_heap_serial :: Int -> [Benchmark]
132o_n_heap_serial value =
133 [ bgroup "elimination"
134 [
135 -- Converting the stream to an array
136 benchFold "writeLastN.Max" (S.fold (IA.writeLastN (value + 1)))
137 (P.sourceUnfoldrM value)
138 , benchFold "writeN" (S.fold (A.writeN value))
139 (P.sourceUnfoldrM value)
140 ]
141 ]
143o_1_space_transformation :: Int -> [Benchmark]
144o_1_space_transformation value =
145 [ bgroup "transformation"
146 [ benchIOSink value "scanl'" (Ops.scanl' value 1)
147 , benchIOSink value "scanl1'" (Ops.scanl1' value 1)
148 , benchIOSink value "map" (Ops.map value 1)
149 ]
150 ]
152o_1_space_transformationX4 :: Int -> [Benchmark]
153o_1_space_transformationX4 value =
154 [ bgroup "transformationX4"
155 [ benchIOSink value "scanl'" (Ops.scanl' value 4)
156 , benchIOSink value "scanl1'" (Ops.scanl1' value 4)
157 , benchIOSink value "map" (Ops.map value 4)
158 ]
159 ]
161moduleName :: String
162#ifdef DATA_SMALLARRAY
163moduleName = "Data.SmallArray"
164#elif defined(MEMORY_ARRAY)
165moduleName = "Data.Array.Foreign"
166#elif defined(DATA_ARRAY_PRIM)
167moduleName = "Data.Array.Prim"
168#elif defined(DATA_ARRAY_PRIM_PINNED)
169moduleName = "Data.Array.Prim.Pinned"
170#else
171moduleName = "Data.Array"
172#endif
174#ifdef DATA_SMALLARRAY
175defStreamSize :: Int
176defStreamSize = 128
177#else
178defStreamSize :: Int
179defStreamSize = defaultStreamSize
180#endif
182main :: IO ()
183main = runWithCLIOpts defStreamSize allBenchmarks
185 where
187 allBenchmarks size =
188 [ bgroup (o_1_space_prefix moduleName) $ concat
189 [ o_1_space_generation size
190 , o_1_space_elimination size
191 , o_1_space_transformation size
192 , o_1_space_transformationX4 size
193 ]
194 , bgroup (o_n_space_prefix moduleName) $
195 o_n_heap_serial size
196 ]