on ec08681 help sign in
streamly/benchmark/BaseStreams.hs
128 lines 5.3 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)
12import Gauge
13import qualified StreamDOps as D
14import qualified StreamKOps as K
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{-# INLINE benchIO #-}
19benchIO :: String -> (a IO Int -> IO ()) -> (Int -> a IO Int) -> Benchmark
20benchIO name run f = bench name $ nfIO $ randomRIO (1,1000) >>= run . f
22benchFold :: NFData b
23 => String -> (t IO Int -> IO b) -> (Int -> t IO Int) -> Benchmark
24benchFold name f src = bench name $ nfIO $ randomRIO (1,1000) >>= f . src
26{-
27_benchId :: NFData b => String -> (Ops.Stream m Int -> Identity b) -> Benchmark
28_benchId name f = bench name $ nf (runIdentity . f) (Ops.source 10)
29-}
31main :: IO ()
32main = do
33 defaultMain
34 [ bgroup "streamD"
35 [ bgroup "generation"
36 [ benchIO "unfoldr" D.toNull D.sourceUnfoldr
37 , benchIO "unfoldrM" D.toNull D.sourceUnfoldrM
38 , benchIO "fromEnum" D.toNull D.sourceFromEnum
40 , benchIO "fromList" D.toNull D.sourceFromList
41 -- , benchIO "fromFoldableM" D.sourceFromFoldableM
42 ]
43 , bgroup "elimination"
44 [ benchIO "toNull" D.toNull D.sourceUnfoldrM
45 , benchIO "uncons" D.uncons D.sourceUnfoldrM
46 , benchIO "nullHeadTail" D.nullHeadTail D.sourceUnfoldrM
47 ]
48 , bgroup "transformation"
49 [ benchIO "scanlM'" D.scan D.sourceUnfoldrM
50 , benchIO "map" D.map D.sourceUnfoldrM
51 , benchIO "mapM" D.mapM D.sourceUnfoldrM
52 ]
53 , bgroup "filtering"
54 [ benchIO "filter-even" D.filterEven D.sourceUnfoldrM
55 , benchIO "filter-all-out" D.filterAllOut D.sourceUnfoldrM
56 , benchIO "filter-all-in" D.filterAllIn D.sourceUnfoldrM
57 , benchIO "take-all" D.takeAll D.sourceUnfoldrM
58 , benchIO "takeWhile-true" D.takeWhileTrue D.sourceUnfoldrM
59 , benchIO "drop-all" D.dropAll D.sourceUnfoldrM
60 , benchIO "dropWhile-true" D.dropWhileTrue D.sourceUnfoldrM
61 ]
62 , benchIO "zip" D.zip D.sourceUnfoldrM
63 , bgroup "compose"
64 [ benchIO "mapM" D.composeMapM D.sourceUnfoldrM
65 , benchIO "map-with-all-in-filter" D.composeMapAllInFilter D.sourceUnfoldrM
66 , benchIO "all-in-filters" D.composeAllInFilters D.sourceUnfoldrM
67 , benchIO "all-out-filters" D.composeAllOutFilters D.sourceUnfoldrM
68 ]
69 -- Scaling with same operation in sequence
70 , bgroup "compose-scaling"
71 [ benchIO "1" (D.composeScaling 1) D.sourceUnfoldrM
72 , benchIO "2" (D.composeScaling 2) D.sourceUnfoldrM
73 , benchIO "3" (D.composeScaling 3) D.sourceUnfoldrM
74 , benchIO "4" (D.composeScaling 4) D.sourceUnfoldrM
75 ]
76 ]
77 , bgroup "streamK"
78 [ bgroup "generation"
79 [ benchIO "unfoldr" K.toNull K.sourceUnfoldr
80 , benchIO "unfoldrM" K.toNull K.sourceUnfoldrM
81 -- , benchIO "fromEnum" K.toNull K.sourceFromEnum
83 , benchIO "fromFoldable" K.toNull K.sourceFromFoldable
84 -- , benchIO "fromFoldableM" K.toNull K.sourceFromFoldableM
86 -- appends
87 , benchIO "foldMapWith" K.toNull K.sourceFoldMapWith
88 , benchIO "foldMapWithM" K.toNull K.sourceFoldMapWithM
89 ]
90 , bgroup "elimination"
91 [ benchIO "toNull" K.toNull K.sourceUnfoldrM
92 , benchIO "uncons" K.uncons K.sourceUnfoldrM
93 , benchIO "nullHeadTail" K.nullHeadTail K.sourceUnfoldrM
94 , benchFold "toList" K.toList K.sourceUnfoldrM
95 , benchFold "fold" K.foldl K.sourceUnfoldrM
96 , benchFold "last" K.last K.sourceUnfoldrM
97 ]
98 , bgroup "transformation"
99 [ benchIO "scan" K.scan K.sourceUnfoldrM
100 , benchIO "map" K.map K.sourceUnfoldrM
101 , benchIO "mapM" K.mapM K.sourceUnfoldrM
102 -- , benchIO "concat" K.concat K.sourceUnfoldrM
103 ]
104 , bgroup "filtering"
105 [ benchIO "filter-even" K.filterEven K.sourceUnfoldrM
106 , benchIO "filter-all-out" K.filterAllOut K.sourceUnfoldrM
107 , benchIO "filter-all-in" K.filterAllIn K.sourceUnfoldrM
108 , benchIO "take-all" K.takeAll K.sourceUnfoldrM
109 , benchIO "takeWhile-true" K.takeWhileTrue K.sourceUnfoldrM
110 , benchIO "drop-all" K.dropAll K.sourceUnfoldrM
111 , benchIO "dropWhile-true" K.dropWhileTrue K.sourceUnfoldrM
112 ]
113 , benchIO "zip" K.zip K.sourceUnfoldrM
114 , bgroup "compose"
115 [ benchIO "mapM" K.composeMapM K.sourceUnfoldrM
116 , benchIO "map-with-all-in-filter" K.composeMapAllInFilter K.sourceUnfoldrM
117 , benchIO "all-in-filters" K.composeAllInFilters K.sourceUnfoldrM
118 , benchIO "all-out-filters" K.composeAllOutFilters K.sourceUnfoldrM
119 ]
120 -- Scaling with same operation in sequence
121 , bgroup "compose-scaling"
122 [ benchIO "1" (K.composeScaling 1) K.sourceUnfoldrM
123 , benchIO "2" (K.composeScaling 2) K.sourceUnfoldrM
124 , benchIO "3" (K.composeScaling 3) K.sourceUnfoldrM
125 , benchIO "4" (K.composeScaling 4) K.sourceUnfoldrM
126 ]
127 ]
128 ]