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(..), deepseq)
15import System.Random (randomRIO)
17import qualified Streamly.Benchmark.Data.SmallArrayOps as Ops
18import qualified Streamly.Data.SmallArray 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 :: (NFData a)
35 => String -> (Int -> IO (Ops.Stream a)) -> Benchmark
36benchIOSrc name src = benchIO name src id
38{-# INLINE benchPureSink #-}
39benchPureSink :: NFData b => String -> (Ops.Stream Int -> b) -> Benchmark
40benchPureSink name f = benchIO name Ops.sourceIntFromTo f
42{-# INLINE benchIO' #-}
43benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
44benchIO' name src f = bench name $ nfIO $
45 randomRIO (1,1) >>= src >>= f
47{-# INLINE benchIOSink #-}
48benchIOSink :: NFData b => String -> (Ops.Stream Int -> IO b) -> Benchmark
49benchIOSink name f = benchIO' name Ops.sourceIntFromTo f
54 show (Ops.value + 1) ++ " [1" ++ concat (replicate Ops.value ",1") ++ "]"
61 [ benchIOSrc "writeN . intFromTo" Ops.sourceIntFromTo
62 , benchIOSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
63 , benchIOSrc "writeN . unfoldr" Ops.sourceUnfoldr
64 , benchIOSrc "writeN . fromList" Ops.sourceFromList
65 , mkString `deepseq` (bench "read" $ nf Ops.readInstance mkString)
66 , benchPureSink "show" Ops.showInstance
68 , bgroup "elimination"
69 [ benchPureSink "id" id
70 , benchPureSink "==" Ops.eqInstance
71 , benchPureSink "/=" Ops.eqInstanceNotEq
72 , benchPureSink "<" Ops.ordInstance
73 , benchPureSink "min" Ops.ordInstanceMin
74 -- length is used to check for foldr/build fusion
75 -- , benchPureSink "length . IsList.toList" (length . GHC.toList)
76 , benchIOSink "foldl'" Ops.pureFoldl'
77 , benchIOSink "read" (S.drain . S.unfold A.read)
78 , benchIOSink "toStreamRev" (S.drain . A.toStreamRev)
80 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
81 , benchPureSink "foldable/sum" Ops.foldableSum
84 , bgroup "transformation"
85 [ benchIOSink "scanl'" (Ops.scanl' 1)
86 , benchIOSink "scanl1'" (Ops.scanl1' 1)
87 , benchIOSink "map" (Ops.map 1)
89 , bgroup "transformationX4"
90 [ benchIOSink "scanl'" (Ops.scanl' 4)
91 , benchIOSink "scanl1'" (Ops.scanl1' 4)
92 , 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