on cee86ff help sign in
97 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(..))
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
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 :: 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
50{-
51mkString :: String
52mkString = "[1" ++ concat (replicate Ops.value ",1") ++ "]"
53-}
55main :: IO ()
56main =
57 defaultMain
58 [ bgroup "Data.Prim.Array"
59 [ bgroup "generation"
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
69 ]
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)
81#ifdef DEVBUILD
82 , benchPureSink "foldable/foldl'" Ops.foldableFoldl'
83 , benchPureSink "foldable/sum" Ops.foldableSum
84#endif
85 ]
86 , bgroup "transformation"
87 [ benchIOSink "scanl'" (Ops.scanl' 1)
88 , benchIOSink "scanl1'" (Ops.scanl1' 1)
89 , benchIOSink "map" (Ops.map 1)
90 ]
91 , bgroup "transformationX4"
92 [ benchIOSink "scanl'" (Ops.scanl' 4)
93 , benchIOSink "scanl1'" (Ops.scanl1' 4)
94 , benchIOSink "map" (Ops.map 4)
95 ]
96 ]
97 ]