3-- Copyright : (c) 2020 Composewell Technologies
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
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
18import qualified Streamly.Internal.Data.Array as IA
20import qualified Streamly.Internal.Data.Array.Foreign as IA
22import qualified Streamly.Prelude as S
25import Streamly.Benchmark.Common hiding (benchPureSrc)
26import qualified Streamly.Benchmark.Prelude as P
29import qualified GHC.Exts as GHC
32#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
33import Control.DeepSeq (deepseq)
36-------------------------------------------------------------------------------
38-------------------------------------------------------------------------------
41-- Drain a source that generates a pure array
42{-# INLINE benchPureSrc #-}
43benchPureSrc :: String -> (Int -> Ops.Stream a) -> Benchmark
44benchPureSrc name src = benchPure name src id
48benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
49benchIO name src f = bench name $ nfIO $
50 randomRIO (1,1) >>= src >>= return . f
52-- Drain a source that generates an array in the IO monad
53{-# INLINE benchIOSrc #-}
55#if !defined(DATA_ARRAY_PRIM) \
56 && !defined(DATA_ARRAY_PRIM_PINNED) \
57 && !defined(MEMORY_ARRAY)
60 String -> (Int -> IO (Ops.Stream a)) -> Benchmark
61benchIOSrc name src = benchIO name src id
63{-# INLINE benchPureSink #-}
64benchPureSink :: NFData b => Int -> String -> (Ops.Stream Int -> b) -> Benchmark
65benchPureSink value name f = benchIO name (Ops.sourceIntFromTo value) f
67{-# INLINE benchIO' #-}
68benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
69benchIO' name src f = bench name $ nfIO $
70 randomRIO (1,1) >>= src >>= f
72{-# INLINE benchIOSink #-}
73benchIOSink :: NFData b => Int -> String -> (Ops.Stream Int -> IO b) -> Benchmark
74benchIOSink value name f = benchIO' name (Ops.sourceIntFromTo value) f
76o_1_space_generation :: Int -> [Benchmark]
77o_1_space_generation value =
80 [ benchIOSrc "writeN . intFromTo" (Ops.sourceIntFromTo value)
81#ifndef DATA_SMALLARRAY
82 , benchIOSrc "write . intFromTo" (Ops.sourceIntFromToFromStream value)
85 "fromList . intFromTo"
86 (Ops.sourceIntFromToFromList value)
87 , benchIOSrc "writeN . unfoldr" (Ops.sourceUnfoldr value)
88 , benchIOSrc "writeN . fromList" (Ops.sourceFromList value)
90 , benchPureSrc "writeN . IsList.fromList" (Ops.sourceIsList value)
92 "writeN . IsString.fromString"
93 (Ops.sourceIsString value)
95#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
100 "[1" ++ concat (replicate value ",1") ++ "]"
102 , let testStr = mkListString value
104 in testStr `deepseq` (bench "read" $ nf Ops.readInstance testStr)
106 , benchPureSink value "show" Ops.showInstance
110o_1_space_elimination :: Int -> [Benchmark]
111o_1_space_elimination value =
112 [ bgroup "elimination"
113 [ benchPureSink value "id" id
114 , benchPureSink value "==" Ops.eqInstance
115 , benchPureSink value "/=" Ops.eqInstanceNotEq
116 , benchPureSink value "<" Ops.ordInstance
117 , benchPureSink value "min" Ops.ordInstanceMin
119 -- length is used to check for foldr/build fusion
120 , benchPureSink value "length . IsList.toList" (length . GHC.toList)
122 , benchIOSink value "foldl'" Ops.pureFoldl'
123 , benchIOSink value "read" Ops.unfoldReadDrain
124 , benchIOSink value "toStreamRev" Ops.toStreamRevDrain
125 , benchFold "writeLastN.1"
126 (S.fold (IA.writeLastN 1)) (P.sourceUnfoldrM value)
127 , benchFold "writeLastN.10"
128 (S.fold (IA.writeLastN 10)) (P.sourceUnfoldrM value)
129#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
132 , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
133 , benchPureSink value "foldable/sum" Ops.foldableSum
140o_n_heap_serial :: Int -> [Benchmark]
141o_n_heap_serial value =
142 [ bgroup "elimination"
144 -- Converting the stream to an array
145 benchFold "writeLastN.Max" (S.fold (IA.writeLastN (value + 1)))
146 (P.sourceUnfoldrM value)
147 , benchFold "writeN" (S.fold (A.writeN value))
148 (P.sourceUnfoldrM value)
152o_1_space_transformation :: Int -> [Benchmark]
153o_1_space_transformation value =
154 [ bgroup "transformation"
155 [ benchIOSink value "scanl'" (Ops.scanl' value 1)
156 , benchIOSink value "scanl1'" (Ops.scanl1' value 1)
157 , benchIOSink value "map" (Ops.map value 1)
161o_1_space_transformationX4 :: Int -> [Benchmark]
162o_1_space_transformationX4 value =
163 [ bgroup "transformationX4"
164 [ benchIOSink value "scanl'" (Ops.scanl' value 4)
165 , benchIOSink value "scanl1'" (Ops.scanl1' value 4)
166 , benchIOSink value "map" (Ops.map value 4)
171#ifdef DATA_SMALLARRAY
172moduleName = "Data.SmallArray"
173#elif defined(MEMORY_ARRAY)
174moduleName = "Data.Array.Foreign"
175#elif defined(DATA_ARRAY_PRIM)
176moduleName = "Data.Array.Prim"
177#elif defined(DATA_ARRAY_PRIM_PINNED)
178moduleName = "Data.Array.Prim.Pinned"
180moduleName = "Data.Array"
183#ifdef DATA_SMALLARRAY
188defStreamSize = defaultStreamSize
192main = runWithCLIOpts defStreamSize allBenchmarks
197 [ bgroup (o_1_space_prefix moduleName) $ concat
198 [ o_1_space_generation size
199 , o_1_space_elimination size
200 , o_1_space_transformation size
201 , o_1_space_transformationX4 size
203 , bgroup (o_n_space_prefix moduleName) $
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list