on ede29df help sign in
streamly/benchmark/LinearAsync.hs
104 lines 4.4 kB history raw
1-- |
2-- Module : Main
3-- Copyright : (c) 2018 Harendra Kumar
4--
5-- License : BSD3
6-- Maintainer : harendra.kumar@gmail.com
8import Control.DeepSeq (NFData)
9-- import Data.Functor.Identity (Identity, runIdentity)
10import System.Random (randomRIO)
11import qualified LinearOps as Ops
13import Streamly
14import Gauge
16-- We need a monadic bind here to make sure that the function f does not get
17-- completely optimized out by the compiler in some cases.
18--
19-- | Takes a fold method, and uses it with a default source.
20{-# INLINE benchIO #-}
21benchIO :: (IsStream t, NFData b) => String -> (t IO Int -> IO b) -> Benchmark
22benchIO name f = bench name $ nfIO $ randomRIO (1,1) >>= f . Ops.source
24-- | Takes a source, and uses it with a default drain/fold method.
25{-# INLINE benchSrcIO #-}
26benchSrcIO
27 :: (t IO Int -> SerialT IO Int)
28 -> String
29 -> (Int -> t IO Int)
30 -> Benchmark
31benchSrcIO t name f
32 = bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
34{-
35_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
36_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
37-}
39main :: IO ()
40main =
41 defaultMain
42 [ bgroup "asyncly"
43 [ benchSrcIO asyncly "unfoldr" Ops.sourceUnfoldr
44 , benchSrcIO asyncly "unfoldrM" Ops.sourceUnfoldrM
45 , benchSrcIO asyncly "fromFoldable" Ops.sourceFromFoldable
46 , benchSrcIO asyncly "fromFoldableM" Ops.sourceFromFoldableM
47 , benchSrcIO asyncly "foldMapWith" Ops.sourceFoldMapWith
48 , benchSrcIO asyncly "foldMapWithM" Ops.sourceFoldMapWithM
49 , benchSrcIO asyncly "foldMapM" Ops.sourceFoldMapM
50 , benchIO "map" $ Ops.map' asyncly 1
51 , benchIO "fmap" $ Ops.fmap' asyncly 1
52 , benchIO "mapM" $ Ops.mapM asyncly 1
53 , benchSrcIO asyncly "unfoldrM maxThreads 1"
54 (maxThreads 1 . Ops.sourceUnfoldrM)
55 , benchSrcIO asyncly "unfoldrM maxBuffer 1 (1000 ops)"
56 (maxBuffer 1 . Ops.sourceUnfoldrMN 1000)
57 ]
58 , bgroup "wAsyncly"
59 [ benchSrcIO wAsyncly "unfoldr" Ops.sourceUnfoldr
60 , benchSrcIO wAsyncly "unfoldrM" Ops.sourceUnfoldrM
61 , benchSrcIO wAsyncly "fromFoldable" Ops.sourceFromFoldable
62 , benchSrcIO wAsyncly "fromFoldableM" Ops.sourceFromFoldableM
63 , benchSrcIO wAsyncly "foldMapWith" Ops.sourceFoldMapWith
64 , benchSrcIO wAsyncly "foldMapWithM" Ops.sourceFoldMapWithM
65 , benchSrcIO wAsyncly "foldMapM" Ops.sourceFoldMapM
66 , benchIO "map" $ Ops.map' wAsyncly 1
67 , benchIO "fmap" $ Ops.fmap' wAsyncly 1
68 , benchIO "mapM" $ Ops.mapM wAsyncly 1
69 ]
70 -- unfoldr and fromFoldable are always serial and thereofore the same for
71 -- all stream types.
72 , bgroup "aheadly"
73 [ benchSrcIO aheadly "unfoldr" Ops.sourceUnfoldr
74 , benchSrcIO aheadly "unfoldrM" Ops.sourceUnfoldrM
75 , benchSrcIO aheadly "fromFoldableM" Ops.sourceFromFoldableM
76 -- , benchSrcIO aheadly "foldMapWith" Ops.sourceFoldMapWith
77 , benchSrcIO aheadly "foldMapWithM" Ops.sourceFoldMapWithM
78 , benchSrcIO aheadly "foldMapM" Ops.sourceFoldMapM
79 , benchIO "map" $ Ops.map' aheadly 1
80 , benchIO "fmap" $ Ops.fmap' aheadly 1
81 , benchIO "mapM" $ Ops.mapM aheadly 1
82 , benchSrcIO aheadly "unfoldrM maxThreads 1"
83 (maxThreads 1 . Ops.sourceUnfoldrM)
84 , benchSrcIO aheadly "unfoldrM maxBuffer 1 (1000 ops)"
85 (maxBuffer 1 . Ops.sourceUnfoldrMN 1000)
86 -- , benchSrcIO aheadly "fromFoldable" Ops.sourceFromFoldable
87 ]
88 -- XXX need to use smaller streams to finish in reasonable time
89 , bgroup "parallely"
90 [ benchSrcIO parallely "unfoldr" Ops.sourceUnfoldr
91 , benchSrcIO parallely "unfoldrM" Ops.sourceUnfoldrM
92 --, benchSrcIO parallely "fromFoldable" Ops.sourceFromFoldable
93 , benchSrcIO parallely "fromFoldableM" Ops.sourceFromFoldableM
94 -- , benchSrcIO parallely "foldMapWith" Ops.sourceFoldMapWith
95 , benchSrcIO parallely "foldMapWithM" Ops.sourceFoldMapWithM
96 , benchSrcIO parallely "foldMapM" Ops.sourceFoldMapM
97 , benchIO "map" $ Ops.map' parallely 1
98 , benchIO "fmap" $ Ops.fmap' parallely 1
99 , benchIO "mapM" $ Ops.mapM parallely 1
100 -- Zip has only one parallel flavor
101 , benchIO "zip" Ops.zipAsync
102 , benchIO "zipM" Ops.zipAsyncM
103 ]
104 ]