3-- Copyright : (c) 2018 Harendra Kumar
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
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.
19-- | Takes a fold method, and uses it with a default source.
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 #-}
27 :: (t IO Int -> SerialT IO Int)
32 = bench name $ nfIO $ randomRIO (1,1) >>= Ops.toNull t . f
35_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
36_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
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)
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
70 -- unfoldr and fromFoldable are always serial and thereofore the same for
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
88 -- XXX need to use smaller streams to finish in reasonable time
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
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list