@@ -0,0 +1,198 @@
1+module Main where
2+
3+import BuildLib (Quickness(..))
4+import BenchRunner (mainWith)
5+import Data.Map (Map)
6+import Data.List (isInfixOf, isPrefixOf, isSuffixOf)
7+
8+import qualified Data.Map as Map
9+
10+groupTargets :: Map String [String]
11+groupTargets =
12+ Map.fromList
13+ [ ( "base_stream_grp"
14+ , [ "Data.Stream.StreamD"
15+ , "Data.Stream.StreamK"
16+ , "Data.Stream.StreamDK"
17+ ])
18+ , ("prelude_serial_grp", preudeSerialGrp)
19+ , ("prelude_concurrent_grp", preudeConcurrentGrp)
20+ , ( "prelude_other_grp"
21+ , ["Prelude.Rate", "Prelude.Concurrent", "Prelude.Adaptive"])
22+ , ( "array_grp"
23+ , [ "Data.Array"
24+ , "Data.Array.Foreign"
25+ , "Data.Array.Prim"
26+ , "Data.SmallArray"
27+ , "Data.Array.Prim.Pinned"
28+ ])
29+ , ("base_parser_grp", ["Data.Parser.ParserD", "Data.Parser.ParserK"])
30+ , ("parser_grp", ["Data.Fold", "Data.Parser"])
31+ , ("list_grp ", [])
32+ , ( "infinite_grp"
33+ , preudeSerialGrp ++ preudeConcurrentGrp ++ ["Prelude.Rate"])
34+ ]
35+
36+ where
37+
38+ preudeSerialGrp = ["Prelude.Serial", "Prelude.WSerial", "Prelude.ZipSerial"]
39+ preudeConcurrentGrp =
40+ [ "Prelude.Async"
41+ , "Prelude.WAsync"
42+ , "Prelude.Ahead"
43+ , "Prelude.Parallel"
44+ , "Prelude.ZipAsync"
45+ ]
46+
47+individualTargers :: [String]
48+individualTargers =
49+ [ "Data.Unfold"
50+ , "Unicode.Stream"
51+ , "Unicode.Char"
52+ , "Unicode.Utf8"
53+ , "FileSystem.Handle"
54+ ]
55+
56+comparisions :: Map String [String]
57+comparisions =
58+ Map.fromList
59+ [ ("base_stream_cmp", ["Data.Stream.StreamD", "Data.Stream.StreamK"])
60+ , ("serial_wserial_cmp", ["Prelude.Serial", "Prelude.WSerial"])
61+ , ("serial_async_cmp", ["Prelude.Serial", "Prelude.Async"])
62+ , ( "concurrent_cmp"
63+ , [ "Prelude.Async"
64+ , "Prelude.WAsync"
65+ , "Prelude.Ahead"
66+ , "Prelude.Parallel"
67+ ])
68+ , ( "array_cmp"
69+ , [ "Data.Array.Foreign"
70+ , "Data.Array.Prim"
71+ , "Data.Array"
72+ , "Data.Array.Prim.Pinned"
73+ ])
74+ , ("pinned_array_cmp", ["Data.Array.Foreign", "Data.Array.Prim.Pinned"])
75+ , ("base_parser_cmp", ["Data.Parser.ParserD", "Data.Parser.ParserK"])
76+ ]
77+
78+rtsOpts :: String -> String -> String
79+rtsOpts exeName benchName0 = unwords [general, exeSpecific, benchSpecific]
80+
81+ where
82+
83+ -- Drop All.
84+ benchName = drop 4 benchName0
85+ general
86+ | "o-1-sp" `isInfixOf` benchName = "-K36K -M16M"
87+ | "o-n-h" `isInfixOf` benchName = "-K36K -M32M"
88+ | "o-n-st" `isInfixOf` benchName = "-K1M -M16M"
89+ | "o-n-sp" `isInfixOf` benchName = "-K1M -M32M"
90+ | otherwise = ""
91+ exeSpecific
92+ | "Prelude.Concurrent" `isSuffixOf` exeName = "-K256K -M384M"
93+ | otherwise = ""
94+ benchSpecific
95+ | "Data.Stream.StreamD/o-n-space.elimination.toList" == benchName =
96+ "-K2M"
97+ | "Data.Stream.StreamK/o-n-space.elimination.toList" == benchName =
98+ "-K2M"
99+ | "Prelude.Parallel/o-n-heap.mapping.mapM" == benchName = "-M256M"
100+ | "Prelude.Parallel/o-n-heap.monad-outer-product."
101+ `isPrefixOf` benchName = "-M256M"
102+ | "Prelude.Parallel/o-n-space.monad-outer-product."
103+ `isPrefixOf` benchName = "-M256M"
104+ | "Prelude.Rate/o-1-space." `isPrefixOf` benchName = "-K128K"
105+ | "Prelude.Rate/o-1-space.asyncly." `isPrefixOf` benchName = "-K128K"
106+ | "Prelude.Serial/o-1-space.mixed.sum-product-fold" == benchName =
107+ "-K64M"
108+ | "Prelude.Serial/o-n-heap.grouping.classifySessionsOf" == benchName =
109+ "-K1M -M32M"
110+ | "Prelude.Serial/o-n-heap.Functor." `isPrefixOf` benchName =
111+ "-K4M -M32M"
112+ | "Prelude.Serial/o-n-heap.transformer." `isPrefixOf` benchName =
113+ "-K8M -M64M"
114+ | "Prelude.Serial/o-n-space.Functor." `isPrefixOf` benchName =
115+ "-K4M -M64M"
116+ | "Prelude.Serial/o-n-space.Applicative." `isPrefixOf` benchName =
117+ "-K8M -M128M"
118+ | "Prelude.Serial/o-n-space.Monad." `isPrefixOf` benchName =
119+ "-K8M -M64M"
120+ | "Prelude.Serial/o-n-space.grouping." `isPrefixOf` benchName = ""
121+ | "Prelude.Serial/o-n-space." `isPrefixOf` benchName = "-K4M"
122+ | "Prelude.WSerial/o-n-space." `isPrefixOf` benchName = "-K4M"
123+ | "Prelude.Async/o-n-space.monad-outer-product." `isPrefixOf` benchName =
124+ "-K4M"
125+ | "Prelude.Ahead/o-n-space.monad-outer-product." `isPrefixOf` benchName =
126+ "-K4M"
127+ | "Prelude.Ahead/o-1-space." `isPrefixOf` benchName = "-K128K"
128+ | "Prelude.WAsync/o-n-heap.monad-outer-product.toNull3" == benchName =
129+ "-M64M"
130+ | "Prelude.WAsync/o-n-space.monad-outer-product." `isPrefixOf` benchName =
131+ "-K4M"
132+ | "Data.Parser.ParserD/o-1-space.some" == benchName = "-K8M"
133+ | "Data.Parser/o-1-space.some" == benchName = "-K8M"
134+ | "Data.Parser.ParserD/o-1-space.manyTill" == benchName = "-K4M"
135+ | "Data.Parser/o-1-space.manyTill" == benchName = "-K4M"
136+ | "Data.Parser/o-n-heap.manyAlt" == benchName = "-K4M -M128M"
137+ | "Data.Parser/o-n-heap.someAlt" == benchName = "-K4M -M128M"
138+ | "Data.Parser/o-n-heap.choice" == benchName = "-K16M -M32M"
139+ | "Data.Parser.ParserK/o-n-heap.manyAlt" == benchName = "-K4M -M128M"
140+ | "Data.Parser.ParserK/o-n-heap.someAlt" == benchName = "-K4M -M128M"
141+ | "Data.Parser.ParserK/o-n-heap.sequence" == benchName = "-M64M"
142+ | "Data.Parser.ParserK/o-n-heap.sequenceA" == benchName = "-M64M"
143+ | "Data.SmallArray.o-1-sp" `isPrefixOf` benchName = "-K128K"
144+ | "Data.Array" `isPrefixOf` benchName
145+ && "/o-1-space.generation.show" `isSuffixOf` benchName = "-M32M"
146+ | "Data.Array/o-1-space.transformationX4.map" == benchName = "-M32M"
147+ | "Data.Array.Foreign/o-1-space.elimination.foldable.foldl"
148+ `isPrefixOf` benchName = "-K8M"
149+ | "Data.Array.Foreign/o-1-space.elimination.foldable.sum" == benchName =
150+ "-K8M"
151+ | otherwise = ""
152+
153+speedOpts :: String -> String -> Maybe Quickness
154+speedOpts exeName benchName0 = maybe benchSpecific Just exeSpecific
155+
156+ where
157+
158+ slowestOf Quicker _ = Quicker
159+ slowestOf _ Quicker = Quicker
160+ slowestOf _ _ = SuperQuick
161+
162+ -- Drop All.
163+ benchName = drop 4 benchName0
164+ exeSpecific
165+ | "Prelude.Concurrent" == exeName = Just SuperQuick
166+ | "Prelude.Rate" == exeName = Just SuperQuick
167+ | "Prelude.Adaptive" == exeName = Just SuperQuick
168+ | otherwise = Nothing
169+ benchSpecific
170+ | "Prelude.Parallel/o-n-heap.mapping.mapM" == benchName =
171+ Just SuperQuick
172+ | "Prelude.Parallel/o-n-heap.monad-outer-product."
173+ `isPrefixOf` benchName = Just SuperQuick
174+ | "Prelude.Parallel.o-n-space.monad-outer-product."
175+ `isPrefixOf` benchName = Just SuperQuick
176+ | "Prelude.Parallel/o-n-heap.generation." `isPrefixOf` benchName =
177+ Just Quicker
178+ | "Prelude.Parallel/o-n-heap.mapping." `isPrefixOf` benchName =
179+ Just Quicker
180+ | "Prelude.Parallel/o-n-heap.concat-foldable." `isPrefixOf` benchName =
181+ Just Quicker
182+ | "Prelude.Async/o-1-space.monad-outer-product." `isPrefixOf` benchName =
183+ Just Quicker
184+ | "Prelude.Async/o-n-space.monad-outer-product." `isPrefixOf` benchName =
185+ Just Quicker
186+ | "Prelude.Ahead/o-1-space.monad-outer-product." `isPrefixOf` benchName =
187+ Just Quicker
188+ | "Prelude.Ahead/o-n-space.monad-outer-product." `isPrefixOf` benchName =
189+ Just Quicker
190+ | "Prelude.WAsync/o-n-heap.monad-outer-product." `isPrefixOf` benchName =
191+ Just Quicker
192+ | "Prelude.WAsync/o-n-space.monad-outer-product." `isPrefixOf` benchName =
193+ Just Quicker
194+ | "FileSystem.Handle." `isPrefixOf` benchName = Just Quicker
195+ | otherwise = Nothing
196+
197+main :: IO ()
198+main = mainWith groupTargets individualTargers comparisions speedOpts rtsOpts