on 33b00a6 help sign in
96 lines 3.4 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2019 Composewell Technologies
4--
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
7-- Stability : experimental
8-- Portability : GHC
10{-# LANGUAGE CPP #-}
12module Main (main) where
14import Control.DeepSeq (NFData(..), deepseq)
15import System.Random (randomRIO)
17import qualified Streamly.Benchmark.Data.ArrayOps as Ops
18import qualified Streamly.Data.Array as A
19import qualified Streamly.Prelude as S
21import Gauge
23-------------------------------------------------------------------------------
24--
25-------------------------------------------------------------------------------
27{-# INLINE benchIO #-}
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
51mkString :: String
52mkString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
54main :: IO ()
55main =
56 defaultMain
57 [ bgroup "Data.Array"
58 [ bgroup "generation"
59 [ benchIOSrc "writeN . intFromTo" Ops.sourceIntFromTo
60 , benchIOSrc "write . intFromTo" Ops.sourceIntFromToFromStream
61 , benchIOSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
62 , benchIOSrc "writeN . unfoldr" Ops.sourceUnfoldr
63 , benchIOSrc "writeN . fromList" Ops.sourceFromList
64 -- , benchPureSrc "writeN . IsList.fromList" Ops.sourceIsList
65 -- , benchPureSrc "writeN . IsString.fromString" Ops.sourceIsString
66 , mkString `deepseq` (bench "read" $ nf Ops.readInstance mkString)
67 , benchPureSink "show" Ops.showInstance
68 ]
69 , bgroup "elimination"
70 [ benchPureSink "id" id
71 , benchPureSink "==" Ops.eqInstance
72 , benchPureSink "/=" Ops.eqInstanceNotEq
73 , benchPureSink "<" Ops.ordInstance
74 , benchPureSink "min" Ops.ordInstanceMin
75 -- length is used to check for foldr/build fusion
76 -- , benchPureSink "length . IsList.toList" (length . GHC.toList)
77 , benchIOSink "foldl'" Ops.pureFoldl'
78 , benchIOSink "read" (S.drain . S.unfold A.read)
79 , benchIOSink "toStreamRev" (S.drain . A.toStreamRev)
80#ifdef DEVBUILD
81 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
82 , benchPureSink "foldable/sum" Ops.foldableSum
83#endif
84 ]
85 , bgroup "transformation"
86 [ benchIOSink "scanl'" (Ops.scanl' 1)
87 , benchIOSink "scanl1'" (Ops.scanl1' 1)
88 , benchIOSink "map" (Ops.map 1)
89 ]
90 , bgroup "transformationX4"
91 [ benchIOSink "scanl'" (Ops.scanl' 4)
92 , benchIOSink "scanl1'" (Ops.scanl1' 4)
93 , benchIOSink "map" (Ops.map 4)
94 ]
95 ]
96 ]