on 745265e help sign in
101 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.SmallArrayOps as Ops
18import qualified Streamly.Internal.Data.SmallArray as A
19import qualified Streamly.Prelude as S
21import Streamly.Benchmark.Common hiding (mkString)
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
52mkString :: String
53mkString =
54 "fromListN " ++
55 show (Ops.value + 1) ++ " [1" ++ concat (replicate Ops.value ",1") ++ "]"
57moduleName :: String
58moduleName = "Data.SmallArray"
60o_1_space :: [Benchmark]
61o_1_space =
62 [ bgroup (o_1_space_prefix moduleName)
63 [ bgroup "generation"
64 [ benchIOSrc "writeN . intFromTo" Ops.sourceIntFromTo
65 , benchIOSrc "fromList . intFromTo" Ops.sourceIntFromToFromList
66 , benchIOSrc "writeN . unfoldr" Ops.sourceUnfoldr
67 , benchIOSrc "writeN . fromList" Ops.sourceFromList
68 , mkString `deepseq` (bench "read" $ nf Ops.readInstance mkString)
69 , benchPureSink "show" Ops.showInstance
70 ]
71 , bgroup "elimination"
72 [ benchPureSink "id" id
73 , benchPureSink "==" Ops.eqInstance
74 , benchPureSink "/=" Ops.eqInstanceNotEq
75 , benchPureSink "<" Ops.ordInstance
76 , benchPureSink "min" Ops.ordInstanceMin
77 -- length is used to check for foldr/build fusion
78 -- , benchPureSink "length . IsList.toList" (length . GHC.toList)
79 , benchIOSink "foldl'" Ops.pureFoldl'
80 , benchIOSink "read" (S.drain . S.unfold A.read)
81 , benchIOSink "toStreamRev" (S.drain . A.toStreamRev)
82#ifdef DEVBUILD
83 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
84 , benchPureSink "foldable/sum" Ops.foldableSum
85#endif
86 ]
87 , bgroup "transformation"
88 [ benchIOSink "scanl'" (Ops.scanl' 1)
89 , benchIOSink "scanl1'" (Ops.scanl1' 1)
90 , benchIOSink "map" (Ops.map 1)
91 ]
92 , bgroup "transformationX4"
93 [ benchIOSink "scanl'" (Ops.scanl' 4)
94 , benchIOSink "scanl1'" (Ops.scanl1' 4)
95 , benchIOSink "map" (Ops.map 4)
96 ]
97 ]
98 ]
100main :: IO ()
101main = defaultMain $ concat [o_1_space]