3-- Copyright : (c) 2019 Composewell Technologies
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
7-- Stability : experimental
12module Main (main) where
14import Control.DeepSeq (NFData(..))
15import System.Random (randomRIO)
17import qualified Streamly.Benchmark.Data.Prim.ArrayOps as Ops
18import qualified Streamly.Internal.Data.Prim.Array as A
19import qualified Streamly.Prelude as S
23-------------------------------------------------------------------------------
25-------------------------------------------------------------------------------
28benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
29benchIO name src f = bench name $ nfIO $
30 randomRIO (1,1) >>= src >>= return . f
32-- Drain a source that generates an array in the IO monad
33{-# INLINE benchIOSrc #-}
34benchIOSrc :: A.Prim a => String -> (Int -> IO (Ops.Stream a)) -> Benchmark
35benchIOSrc name src = benchIO name src id
37{-# INLINE benchPureSink #-}
38benchPureSink :: NFData b => String -> (Ops.Stream Int -> b) -> Benchmark
39benchPureSink name f = benchIO name Ops.sourceIntFromTo f
41{-# INLINE benchIO' #-}
42benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
43benchIO' name src f = bench name $ nfIO $
44 randomRIO (1,1) >>= src >>= f
46{-# INLINE benchIOSink #-}
47benchIOSink :: NFData b => String -> (Ops.Stream Int -> IO b) -> Benchmark
48benchIOSink name f = benchIO' name Ops.sourceIntFromTo f
52mkString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
58 [ bgroup "Data.Prim.Array"
60 [ benchIOSrc "writeN . intFromTo" Ops.sourceIntFromTo
61 , benchIOSrc "write . intFromTo" Ops.sourceIntFromToFromStream
62 , benchIOSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
63 , benchIOSrc "writeN . unfoldr" Ops.sourceUnfoldr
64 , benchIOSrc "writeN . fromList" Ops.sourceFromList
65 -- , benchPureSrc "writeN . IsList.fromList" Ops.sourceIsList
66 -- , benchPureSrc "writeN . IsString.fromString" Ops.sourceIsString
67 -- , mkString `deepseq` (bench "read" $ nf Ops.readInstance mkString)
68 , benchPureSink "show" Ops.showInstance
70 , bgroup "elimination"
71 [ benchPureSink "id" id
72 , benchPureSink "==" Ops.eqInstance
73 , benchPureSink "/=" Ops.eqInstanceNotEq
74 , benchPureSink "<" Ops.ordInstance
75 , benchPureSink "min" Ops.ordInstanceMin
76 -- length is used to check for foldr/build fusion
77 -- , benchPureSink "length . IsList.toList" (length . GHC.toList)
78 , benchIOSink "foldl'" Ops.pureFoldl'
79 , benchIOSink "read" (S.drain . S.unfold A.read)
80 , benchIOSink "toStreamRev" (S.drain . A.toStreamRev)
82 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
83 , benchPureSink "foldable/sum" Ops.foldableSum
86 , bgroup "transformation"
87 [ benchIOSink "scanl'" (Ops.scanl' 1)
88 , benchIOSink "scanl1'" (Ops.scanl1' 1)
89 , benchIOSink "map" (Ops.map 1)
91 , bgroup "transformationX4"
92 [ benchIOSink "scanl'" (Ops.scanl' 4)
93 , benchIOSink "scanl1'" (Ops.scanl1' 4)
94 , benchIOSink "map" (Ops.map 4)
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