3-- Copyright : (c) 2020 Composewell Technologies
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
10import Control.DeepSeq (NFData(..))
11import System.Random (randomRIO)
13import qualified Streamly.Benchmark.Data.ArrayOps as Ops
16import Streamly.Benchmark.Common hiding (benchPureSrc)
19import qualified GHC.Exts as GHC
20import Foreign.Storable (Storable(..))
23#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
24import Control.DeepSeq (deepseq)
27-------------------------------------------------------------------------------
29-------------------------------------------------------------------------------
32-- Drain a source that generates a pure array
33{-# INLINE benchPureSrc #-}
35 (NFData a, Storable a) => String -> (Int -> Ops.Stream a) -> Benchmark
36benchPureSrc name src = benchPure name src id
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 #-}
51 String -> (Int -> IO (Ops.Stream a)) -> Benchmark
52benchIOSrc name src = benchIO name src id
54{-# INLINE benchPureSink #-}
55benchPureSink :: NFData b => Int -> String -> (Ops.Stream Int -> b) -> Benchmark
56benchPureSink value name f = benchIO name (Ops.sourceIntFromTo value) f
58{-# INLINE benchIO' #-}
59benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
60benchIO' name src f = bench name $ nfIO $
61 randomRIO (1,1) >>= src >>= f
63{-# INLINE benchIOSink #-}
64benchIOSink :: NFData b => Int -> String -> (Ops.Stream Int -> IO b) -> Benchmark
65benchIOSink value name f = benchIO' name (Ops.sourceIntFromTo value) f
67o_1_space_generation :: Int -> [Benchmark]
68o_1_space_generation value =
71 [ benchIOSrc "writeN . intFromTo" (Ops.sourceIntFromTo value)
72#ifndef DATA_SMALLARRAY
73 , benchIOSrc "write . intFromTo" (Ops.sourceIntFromToFromStream value)
76 "fromList . intFromTo"
77 (Ops.sourceIntFromToFromList value)
78 , benchIOSrc "writeN . unfoldr" (Ops.sourceUnfoldr value)
79 , benchIOSrc "writeN . fromList" (Ops.sourceFromList value)
81 , benchPureSrc "writeN . IsList.fromList" (Ops.sourceIsList value)
83 "writeN . IsString.fromString"
84 (Ops.sourceIsString value)
86#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
91 "[1" ++ concat (replicate value ",1") ++ "]"
93 , let testStr = mkListString value
95 in testStr `deepseq` (bench "read" $ nf Ops.readInstance testStr)
97 , benchPureSink value "show" Ops.showInstance
101o_1_space_elimination :: Int -> [Benchmark]
102o_1_space_elimination value =
103 [ bgroup "elimination"
104 [ benchPureSink value "id" id
105 , benchPureSink value "==" Ops.eqInstance
106 , benchPureSink value "/=" Ops.eqInstanceNotEq
107 , benchPureSink value "<" Ops.ordInstance
108 , benchPureSink value "min" Ops.ordInstanceMin
110 -- length is used to check for foldr/build fusion
111 , benchPureSink value "length . IsList.toList" (length . GHC.toList)
113 , benchIOSink value "foldl'" Ops.pureFoldl'
114 , benchIOSink value "read" Ops.unfoldReadDrain
115 , benchIOSink value "toStreamRev" Ops.toStreamRevDrain
116#if !defined(DATA_ARRAY_PRIM) && !defined(DATA_ARRAY_PRIM_PINNED)
118 , benchPureSink value "foldable/foldl'" Ops.foldableFoldl'
119 , benchPureSink value "foldable/sum" Ops.foldableSum
125o_1_space_transformation :: Int -> [Benchmark]
126o_1_space_transformation value =
127 [ bgroup "transformation"
128 [ benchIOSink value "scanl'" (Ops.scanl' value 1)
129 , benchIOSink value "scanl1'" (Ops.scanl1' value 1)
130 , benchIOSink value "map" (Ops.map value 1)
134o_1_space_transformationX4 :: Int -> [Benchmark]
135o_1_space_transformationX4 value =
136 [ bgroup "transformationX4"
137 [ benchIOSink value "scanl'" (Ops.scanl' value 4)
138 , benchIOSink value "scanl1'" (Ops.scanl1' value 4)
139 , benchIOSink value "map" (Ops.map value 4)
144#ifdef DATA_SMALLARRAY
145moduleName = "Data.SmallArray"
146#elif defined(MEMORY_ARRAY)
147moduleName = "Memory.Array"
148#elif defined(DATA_ARRAY_PRIM)
149moduleName = "Data.Array.Prim"
150#elif defined(DATA_ARRAY_PRIM_PINNED)
151moduleName = "Data.Array.Prim.Pinnned"
153moduleName = "Data.Array"
156#ifdef DATA_SMALLARRAY
161defStreamSize = defaultStreamSize
166 (value, cfg, benches) <- parseCLIOpts defStreamSize
167 value `seq` runMode (mode cfg) cfg benches (allBenchmarks value)
172 [ bgroup (o_1_space_prefix moduleName) $ concat
173 [ o_1_space_generation size
174 , o_1_space_elimination size
175 , o_1_space_transformation size
176 , o_1_space_transformationX4 size
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