@@ -6,7 +6,7 @@
66-- Maintainer : harendra.kumar@gmail.com
77
88import Control.DeepSeq (NFData)
9−import Data.Functor.Identity (Identity, runIdentity)
9+-- import Data.Functor.Identity (Identity, runIdentity)
1010import System.Random (randomRIO)
1111import qualified LinearOps as Ops
1212
@@ -29,102 +29,102 @@ benchSrcIO t name f
2929benchIOAppend :: (NFData b) => String -> (Int -> IO b) -> Benchmark
3030benchIOAppend name f = bench name $ nfIO $ randomRIO (1,1000) >>= f
3131
32+{-
3233_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
3334_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
35+-}
3436
3537main :: IO ()
3638main = do
3739 defaultMain
38− [ bgroup "generation"
39− [ bgroup "serially"
40− [ benchIO "unfoldr" $ Ops.toNull serially
41− , benchSrcIO serially "fromFoldable" Ops.sourceFromFoldable
42− , benchSrcIO serially "foldMapWith" Ops.sourceFoldMapWith
43− , benchSrcIO serially "unfoldrM" Ops.sourceUnfoldrM
44− , benchSrcIO serially "fromFoldableM" Ops.sourceFromFoldableM
45− , benchSrcIO serially "foldMapWithM" Ops.sourceFoldMapWithM
46− ]
40+ [ bgroup "serially"
41+ [ bgroup "generation"
42+ [ benchSrcIO serially "unfoldr" $ Ops.sourceUnfoldr
43+ , benchSrcIO serially "fromFoldable" Ops.sourceFromFoldable
44+ , benchSrcIO serially "foldMapWith" Ops.sourceFoldMapWith
45+ , benchSrcIO serially "unfoldrM" Ops.sourceUnfoldrM
46+ , benchSrcIO serially "fromFoldableM" Ops.sourceFromFoldableM
47+ , benchSrcIO serially "foldMapWithM" Ops.sourceFoldMapWithM
48+ ]
49+ , bgroup "elimination"
50+ [ benchIO "toList" Ops.toList
51+ , benchIO "fold" Ops.foldl
52+ , benchIO "last" Ops.last
53+ ]
54+ , bgroup "transformation"
55+ [ benchIO "scan" Ops.scan
56+ , benchIO "map" Ops.map
57+ , benchIO "mapM" (Ops.mapM serially)
58+ , benchIO "concat" Ops.concat
59+ ]
60+ , bgroup "filtering"
61+ [ benchIO "filter-even" Ops.filterEven
62+ , benchIO "filter-all-out" Ops.filterAllOut
63+ , benchIO "filter-all-in" Ops.filterAllIn
64+ , benchIO "take-all" Ops.takeAll
65+ , benchIO "takeWhile-true" Ops.takeWhileTrue
66+ , benchIO "drop-all" Ops.dropAll
67+ , benchIO "dropWhile-true" Ops.dropWhileTrue
68+ ]
69+ , benchIOAppend "append" $ Ops.append serially
70+ , benchIO "zip" $ Ops.zip
71+ , bgroup "compose"
72+ [ benchIO "mapM" Ops.composeMapM
73+ , benchIO "map-with-all-in-filter" Ops.composeMapAllInFilter
74+ , benchIO "all-in-filters" Ops.composeAllInFilters
75+ , benchIO "all-out-filters" Ops.composeAllOutFilters
76+ ]
77+ -- Scaling with same operation in sequence
78+ , bgroup "compose-scaling"
79+ [ benchIO "1" $ Ops.composeScaling 1
80+ , benchIO "2" $ Ops.composeScaling 2
81+ , benchIO "3" $ Ops.composeScaling 3
82+ , benchIO "4" $ Ops.composeScaling 4
83+ ]
84+ ]
85+ , bgroup "asyncly"
86+ [ -- benchIO "unfoldr" $ Ops.toNull asyncly
87+ -- , benchSrcIO asyncly "fromFoldable" Ops.sourceFromFoldable
88+ benchSrcIO asyncly "foldMapWith" Ops.sourceFoldMapWith
89+ , benchSrcIO asyncly "unfoldrM" Ops.sourceUnfoldrM
90+ , benchSrcIO asyncly "fromFoldableM" Ops.sourceFromFoldableM
91+ , benchSrcIO asyncly "foldMapWithM" Ops.sourceFoldMapWithM
92+ , benchIO "mapM" $ Ops.mapM asyncly
93+ , benchIOAppend "append" $ Ops.append asyncly
94+ ]
95+ , bgroup "wAsyncly"
96+ [ -- benchIO "unfoldr" $ Ops.toNull wAsyncly
97+ -- , benchSrcIO wAsyncly "fromFoldable" Ops.sourceFromFoldable
98+ benchSrcIO wAsyncly "foldMapWith" Ops.sourceFoldMapWith
99+ , benchSrcIO wAsyncly "unfoldrM" Ops.sourceUnfoldrM
100+ , benchSrcIO wAsyncly "fromFoldableM" Ops.sourceFromFoldableM
101+ , benchSrcIO wAsyncly "foldMapWithM" Ops.sourceFoldMapWithM
102+ , benchIO "mapM" $ Ops.mapM wAsyncly
103+ , benchIOAppend "append" $ Ops.append wAsyncly
104+ ]
47105 -- unfoldr and fromFoldable are always serial and thereofore the same for
48106 -- all stream types.
49107 , bgroup "aheadly"
50− [ -- benchIO "unfoldr" $ Ops.toNull aheadly
51− -- , benchSrcIO aheadly "fromFoldable" Ops.sourceFromFoldable
52− benchSrcIO aheadly "foldMapWith" Ops.sourceFoldMapWith
53− , benchSrcIO aheadly "unfoldrM" Ops.sourceUnfoldrM
54− , benchSrcIO aheadly "fromFoldableM" Ops.sourceFromFoldableM
55− , benchSrcIO aheadly "foldMapWithM" Ops.sourceFoldMapWithM
56− ]
57− , bgroup "asyncly"
58− [ -- benchIO "unfoldr" $ Ops.toNull asyncly
59− -- , benchSrcIO asyncly "fromFoldable" Ops.sourceFromFoldable
60− benchSrcIO asyncly "foldMapWith" Ops.sourceFoldMapWith
61− , benchSrcIO asyncly "unfoldrM" Ops.sourceUnfoldrM
62− , benchSrcIO asyncly "fromFoldableM" Ops.sourceFromFoldableM
63− , benchSrcIO asyncly "foldMapWithM" Ops.sourceFoldMapWithM
64− ]
65− , bgroup "wAsyncly"
66− [ -- benchIO "unfoldr" $ Ops.toNull wAsyncly
67− -- , benchSrcIO wAsyncly "fromFoldable" Ops.sourceFromFoldable
68− benchSrcIO wAsyncly "foldMapWith" Ops.sourceFoldMapWith
69− , benchSrcIO wAsyncly "unfoldrM" Ops.sourceUnfoldrM
70− , benchSrcIO wAsyncly "fromFoldableM" Ops.sourceFromFoldableM
71− , benchSrcIO wAsyncly "foldMapWithM" Ops.sourceFoldMapWithM
72− ]
108+ [ -- benchIO "unfoldr" $ Ops.toNull aheadly
109+ -- , benchSrcIO aheadly "fromFoldable" Ops.sourceFromFoldable
110+ benchSrcIO aheadly "foldMapWith" Ops.sourceFoldMapWith
111+ , benchSrcIO aheadly "unfoldrM" Ops.sourceUnfoldrM
112+ , benchSrcIO aheadly "fromFoldableM" Ops.sourceFromFoldableM
113+ , benchSrcIO aheadly "foldMapWithM" Ops.sourceFoldMapWithM
114+ , benchIO "mapM" $ Ops.mapM aheadly
115+ , benchIOAppend "append" $ Ops.append aheadly
116+ ]
73117 -- XXX need to use smaller streams to finish in reasonable time
74118 , bgroup "parallely"
75− [ --benchIO "unfoldr" $ Ops.toNull parallely
76− --, benchSrcIO parallely "fromFoldable" Ops.sourceFromFoldable
77− benchSrcIO parallely "foldMapWith" Ops.sourceFoldMapWith
78− , benchSrcIO parallely "unfoldrM" Ops.sourceUnfoldrM
79− , benchSrcIO parallely "fromFoldableM" Ops.sourceFromFoldableM
80− , benchSrcIO parallely "foldMapWithM" Ops.sourceFoldMapWithM
81− ]
82− ]
83− -- XXX this is the same foldMapWith in the above benchmarks, need to dedup
84− -- this one provides a single place comparsion of all types and uses
85− -- smaller stream size for faster benchmarking. We can use the same for
86− -- above benchmarks and remove this.
87− , bgroup "append"
88− [ benchIOAppend "serially" $ Ops.append serially
89− , benchIOAppend "wSerially" $ Ops.append wSerially
90− , benchIOAppend "aheadly" $ Ops.append aheadly
91− , benchIOAppend "asyncly" $ Ops.append asyncly
92− , benchIOAppend "wAsyncly" $ Ops.append wAsyncly
93− , benchIOAppend "parallely" $ Ops.append parallely
94− ]
95− , bgroup "elimination"
96− [ benchIO "toNull" $ Ops.toNull serially
97− , benchIO "toList" Ops.toList
98− , benchIO "fold" Ops.foldl
99− , benchIO "last" Ops.last
100− ]
101− , bgroup "transformation"
102− [ benchIO "scan" Ops.scan
103− , benchIO "map" Ops.map
104− , benchIO "mapM" Ops.mapM
105− , benchIO "concat" Ops.concat
106− ]
107− , bgroup "filtering"
108− [ benchIO "filter-even" Ops.filterEven
109− , benchIO "filter-all-out" Ops.filterAllOut
110− , benchIO "filter-all-in" Ops.filterAllIn
111− , benchIO "take-all" Ops.takeAll
112− , benchIO "takeWhile-true" Ops.takeWhileTrue
113− , benchIO "drop-all" Ops.dropAll
114− , benchIO "dropWhile-true" Ops.dropWhileTrue
115− ]
116− , benchIO "zip" Ops.zip
117− , bgroup "compose"
118− [ benchIO "mapM" Ops.composeMapM
119− , benchIO "map-with-all-in-filter" Ops.composeMapAllInFilter
120− , benchIO "all-in-filters" Ops.composeAllInFilters
121− , benchIO "all-out-filters" Ops.composeAllOutFilters
122− ]
123− , bgroup "compose-scaling"
124− -- Scaling with same operation in sequence
125− [ benchIO "1" $ Ops.composeScaling 1
126− , benchIO "2" $ Ops.composeScaling 2
127− , benchIO "3" $ Ops.composeScaling 3
128− , benchIO "4" $ Ops.composeScaling 4
119+ [ --benchIO "unfoldr" $ Ops.toNull parallely
120+ --, benchSrcIO parallely "fromFoldable" Ops.sourceFromFoldable
121+ benchSrcIO parallely "foldMapWith" Ops.sourceFoldMapWith
122+ , benchSrcIO parallely "unfoldrM" Ops.sourceUnfoldrM
123+ , benchSrcIO parallely "fromFoldableM" Ops.sourceFromFoldableM
124+ , benchSrcIO parallely "foldMapWithM" Ops.sourceFoldMapWithM
125+ , benchIO "mapM" $ Ops.mapM parallely
126+ , benchIOAppend "append" $ Ops.append parallely
127+ -- Zip has only one parallel flavor
128+ , benchIO "zip" $ Ops.zipAsync
129+ ]
129130 ]
130− ]