on 745265e help sign in
102 lines 3.5 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.Internal.Data.Array as A
19import qualified Streamly.Prelude as S
21import Streamly.Benchmark.Common
22import Gauge
24-------------------------------------------------------------------------------
25--
26-------------------------------------------------------------------------------
28{-# INLINE benchIO #-}
29benchIO :: NFData b => String -> (Int -> IO a) -> (a -> b) -> Benchmark
30benchIO name src f = bench name $ nfIO $
31 randomRIO (1,1) >>= src >>= return . f
33-- Drain a source that generates an array in the IO monad
34{-# INLINE benchIOSrc #-}
35benchIOSrc :: (NFData a)
36 => String -> (Int -> IO (Ops.Stream a)) -> Benchmark
37benchIOSrc name src = benchIO name src id
39{-# INLINE benchPureSink #-}
40benchPureSink :: NFData b => String -> (Ops.Stream Int -> b) -> Benchmark
41benchPureSink name f = benchIO name Ops.sourceIntFromTo f
43{-# INLINE benchIO' #-}
44benchIO' :: NFData b => String -> (Int -> IO a) -> (a -> IO b) -> Benchmark
45benchIO' name src f = bench name $ nfIO $
46 randomRIO (1,1) >>= src >>= f
48{-# INLINE benchIOSink #-}
49benchIOSink :: NFData b => String -> (Ops.Stream Int -> IO b) -> Benchmark
50benchIOSink name f = benchIO' name Ops.sourceIntFromTo f
52testStr :: String
53testStr = mkListString Ops.value
55moduleName :: String
56moduleName = "Data.Array"
58o_1_space :: [Benchmark]
59o_1_space =
60 [ bgroup (o_1_space_prefix moduleName)
61 [ bgroup "generation"
62 [ benchIOSrc "writeN . intFromTo" Ops.sourceIntFromTo
63 , benchIOSrc "write . intFromTo" Ops.sourceIntFromToFromStream
64 , benchIOSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
65 , benchIOSrc "writeN . unfoldr" Ops.sourceUnfoldr
66 , benchIOSrc "writeN . fromList" Ops.sourceFromList
67 -- , benchPureSrc "writeN . IsList.fromList" Ops.sourceIsList
68 -- , benchPureSrc "writeN . IsString.fromString" Ops.sourceIsString
69 , testStr `deepseq` (bench "read" $ nf Ops.readInstance testStr)
70 , benchPureSink "show" Ops.showInstance
71 ]
72 , bgroup "elimination"
73 [ benchPureSink "id" id
74 , benchPureSink "==" Ops.eqInstance
75 , benchPureSink "/=" Ops.eqInstanceNotEq
76 , benchPureSink "<" Ops.ordInstance
77 , benchPureSink "min" Ops.ordInstanceMin
78 -- length is used to check for foldr/build fusion
79 -- , benchPureSink "length . IsList.toList" (length . GHC.toList)
80 , benchIOSink "foldl'" Ops.pureFoldl'
81 , benchIOSink "read" (S.drain . S.unfold A.read)
82 , benchIOSink "toStreamRev" (S.drain . A.toStreamRev)
83#ifdef DEVBUILD
84 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
85 , benchPureSink "foldable/sum" Ops.foldableSum
86#endif
87 ]
88 , bgroup "transformation"
89 [ benchIOSink "scanl'" (Ops.scanl' 1)
90 , benchIOSink "scanl1'" (Ops.scanl1' 1)
91 , benchIOSink "map" (Ops.map 1)
92 ]
93 , bgroup "transformationX4"
94 [ benchIOSink "scanl'" (Ops.scanl' 4)
95 , benchIOSink "scanl1'" (Ops.scanl1' 4)
96 , benchIOSink "map" (Ops.map 4)
97 ]
98 ]
99 ]
101main :: IO ()
102main = defaultMain $ concat [o_1_space]