on ad1bb0d help sign in
174 lines 5.5 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
16#ifdef DATA_ARRAY
17import qualified Streamly.Internal.Data.Array as A
18#else
19import qualified Streamly.Data.Array.Foreign as A
20#endif
22#ifdef DATA_ARRAY
23import qualified Streamly.Internal.Data.Array as IA
24#endif
25import qualified Streamly.Prelude as S
27import Gauge
28import Streamly.Benchmark.Common hiding (benchPureSrc)
29import qualified Streamly.Benchmark.Prelude as P
31#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
32import Control.DeepSeq (deepseq)
33#endif
35-------------------------------------------------------------------------------
36--
37-------------------------------------------------------------------------------
39{-# INLINE benchIO #-}
40benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
41benchIO name src f = bench name $ nfIO $
42 randomRIO (1,1) >>= src >>= return . f
44-- Drain a source that generates an array in the IO monad
45{-# INLINE benchIOSrc #-}
46benchIOSrc ::
47#if !defined(DATA_ARRAY_PRIM_PINNED)
48 NFData a =>
49#endif
50 String -> (Int -> IO (Ops.Stream a)) -> Benchmark
51benchIOSrc name src = benchIO name src id
53{-# INLINE benchPureSink #-}
54benchPureSink :: NFData b => Int -> String -> (Ops.Stream Int -> b) -> Benchmark
55benchPureSink value name f = benchIO name (Ops.sourceIntFromTo value) f
57{-# INLINE benchIO' #-}
58benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
59benchIO' name src f = bench name $ nfIO $
60 randomRIO (1,1) >>= src >>= f
62{-# INLINE benchIOSink #-}
63benchIOSink :: NFData b => Int -> String -> (Ops.Stream Int -> IO b) -> Benchmark
64benchIOSink value name f = benchIO' name (Ops.sourceIntFromTo value) f
66o_1_space_generation :: Int -> [Benchmark]
67o_1_space_generation value =
68 [ bgroup
69 "generation"
70 [ benchIOSrc "writeN . intFromTo" (Ops.sourceIntFromTo value)
71#ifndef DATA_SMALLARRAY
72 , benchIOSrc "write . intFromTo" (Ops.sourceIntFromToFromStream value)
73#endif
74 , benchIOSrc
75 "fromList . intFromTo"
76 (Ops.sourceIntFromToFromList value)
77 , benchIOSrc "writeN . unfoldr" (Ops.sourceUnfoldr value)
78 , benchIOSrc "writeN . fromList" (Ops.sourceFromList value)
79#if !defined(DATA_ARRAY_PRIM_PINNED)
80#ifdef DATA_SMALLARRAY
81 , let testStr =
82 "fromListN " ++
83 show (value + 1) ++
84 "[1" ++ concat (replicate value ",1") ++ "]"
85#else
86 , let testStr = mkListString value
87#endif
88 in testStr `deepseq` (bench "read" $ nf Ops.readInstance testStr)
89#endif
90 , benchPureSink value "show" Ops.showInstance
91 ]
92 ]
94o_1_space_elimination :: Int -> [Benchmark]
95o_1_space_elimination value =
96 [ bgroup "elimination"
97 [ benchPureSink value "id" id
98 , benchPureSink value "==" Ops.eqInstance
99 , benchPureSink value "/=" Ops.eqInstanceNotEq
100 , benchPureSink value "<" Ops.ordInstance
101 , benchPureSink value "min" Ops.ordInstanceMin
102 , benchIOSink value "foldl'" Ops.pureFoldl'
103 , benchIOSink value "read" Ops.unfoldReadDrain
104 , benchIOSink value "toStreamRev" Ops.toStreamRevDrain
105 , benchFold "writeLastN.1"
106 (S.fold (IA.writeLastN 1)) (P.sourceUnfoldrM value)
107 , benchFold "writeLastN.10"
108 (S.fold (IA.writeLastN 10)) (P.sourceUnfoldrM value)
109#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
110#ifdef DEVBUILD
111{-
112 , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
113 , benchPureSink value "foldable/sum" Ops.foldableSum
114-}
115#endif
116#endif
117 ]
118 ]
120o_n_heap_serial :: Int -> [Benchmark]
121o_n_heap_serial value =
122 [ bgroup "elimination"
123 [
124 -- Converting the stream to an array
125 benchFold "writeLastN.Max" (S.fold (IA.writeLastN (value + 1)))
126 (P.sourceUnfoldrM value)
127 , benchFold "writeN" (S.fold (A.writeN value))
128 (P.sourceUnfoldrM value)
129 ]
130 ]
132o_1_space_transformation :: Int -> [Benchmark]
133o_1_space_transformation value =
134 [ bgroup "transformation"
135 [ benchIOSink value "scanl'" (Ops.scanl' value 1)
136 , benchIOSink value "scanl1'" (Ops.scanl1' value 1)
137 , benchIOSink value "map" (Ops.map value 1)
138 ]
139 ]
141o_1_space_transformationX4 :: Int -> [Benchmark]
142o_1_space_transformationX4 value =
143 [ bgroup "transformationX4"
144 [ benchIOSink value "scanl'" (Ops.scanl' value 4)
145 , benchIOSink value "scanl1'" (Ops.scanl1' value 4)
146 , benchIOSink value "map" (Ops.map value 4)
147 ]
148 ]
150moduleName :: String
151#if defined(DATA_ARRAY_PRIM_PINNED)
152moduleName = "Data.Array.Prim.Pinned"
153#else
154moduleName = "Data.Array"
155#endif
157defStreamSize :: Int
158defStreamSize = defaultStreamSize
160main :: IO ()
161main = runWithCLIOpts defStreamSize allBenchmarks
163 where
165 allBenchmarks size =
166 [ bgroup (o_1_space_prefix moduleName) $ concat
167 [ o_1_space_generation size
168 , o_1_space_elimination size
169 , o_1_space_transformation size
170 , o_1_space_transformationX4 size
171 ]
172 , bgroup (o_n_space_prefix moduleName) $
173 o_n_heap_serial size
174 ]