11-- | # Benchmarking
22-- |
3- -- | spago -x spago-dev.dhall run --main Bench.Main
3+ -- | spago -x spago-dev.dhall run --main Bench.Main --node-args '--expose-gc'
44-- |
55-- | This benchmark suite is intended to guide changes to this package so that
66-- | we can compare the benchmarks of different commits.
1010-- | than Regex?” Answer: approximately 100×. The Regex benchmarks also give
1111-- | us a rough way to calibrate benchmarks run on different platforms.
1212-- |
13+ -- | `--expose-gc` is from
14+ -- | https://pursuit.purescript.org/packages/purescript-minibench/3.0.0/docs/Performance.Minibench#v:benchWith
15+ -- |
16+ -- | # Benchmark comparison for different commits
17+ -- |
18+ -- | The file bench.html will contain a Github-flavored-Markdown-compatible HTML
19+ -- | table of the benchmarks side-by-side.
20+ -- |
21+ -- | spago -x spago-dev.dhall run --main Bench.Main --node-args '--expose-gc' > bench1.txt
22+ -- | spago -x spago-dev.dhall run --main Bench.Main --node-args '--expose-gc' > bench2.txt
23+ -- | nix-shell -p saxon --command 'saxon <(echo "<table>"; cat bench1.txt bench2.txt; echo "</table>") bench/tabletranspose.xslt > bench.html'
24+ -- |
1325-- | # Profiling
1426-- |
1527-- | https://nodejs.org/en/docs/guides/simple-profiling/
@@ -44,6 +56,8 @@ import Prelude
4456import Bench.Json.Parsing as BenchParsing
4557import Bench.Json.StringParser as BenchStringParser
4658import Bench.Json.TestData (largeJson , mediumJson , smallJson )
59+ import Control.Monad.Trampoline (runTrampoline )
60+ import Control.Monad.Free (liftF )
4761import Data.Array (fold , replicate )
4862import Data.Either (either )
4963import Data.List (many , manyRec )
@@ -56,7 +70,7 @@ import Effect.Console (log)
5670import Effect.Exception (throw )
5771import Effect.Unsafe (unsafePerformEffect )
5872import Performance.Minibench (benchWith )
59- import Text.Parsing.Parser (Parser , runParser )
73+ import Text.Parsing.Parser (Parser , runParser , runParserT )
6074import Text.Parsing.Parser.String (string )
6175import Text.Parsing.Parser.String.Basic (digit )
6276import StringParser as StringParser
@@ -69,26 +83,41 @@ string23 = "23"
6983string23_2 :: String
7084string23_2 = fold $ replicate 2 string23
7185
72- string23_10000 :: String
73- string23_10000 = fold $ replicate 10000 string23
86+ -- string23_10000 :: String
87+ -- string23_10000 = fold $ replicate 10000 string23
88+
89+ string23_500 :: String
90+ string23_500 = fold $ replicate 500 string23
7491
7592stringSkidoo :: String
7693stringSkidoo = " skidoo"
7794
7895stringSkidoo_2 :: String
7996stringSkidoo_2 = fold $ replicate 2 stringSkidoo
8097
81- stringSkidoo_10000 :: String
82- stringSkidoo_10000 = fold $ replicate 10000 stringSkidoo
98+ -- stringSkidoo_10000 :: String
99+ -- stringSkidoo_10000 = fold $ replicate 10000 stringSkidoo
100+
101+ stringSkidoo_1000 :: String
102+ stringSkidoo_1000 = fold $ replicate 1000 stringSkidoo
83103
84104parse23 :: Parser String (List Char )
85- parse23 = manyRec digit
105+ parse23 = many digit
86106
87107parse23Points :: StringParser.Parser (List Char )
88- parse23Points = manyRec StringParser.CodePoints .anyDigit
108+ parse23Points = many StringParser.CodePoints .anyDigit
89109
90110parse23Units :: StringParser.Parser (List Char )
91- parse23Units = manyRec StringParser.CodeUnits .anyDigit
111+ parse23Units = many StringParser.CodeUnits .anyDigit
112+
113+ parse23Rec :: Parser String (List Char )
114+ parse23Rec = manyRec digit
115+
116+ parse23PointsRec :: StringParser.Parser (List Char )
117+ parse23PointsRec = manyRec StringParser.CodePoints .anyDigit
118+
119+ parse23UnitsRec :: StringParser.Parser (List Char )
120+ parse23UnitsRec = manyRec StringParser.CodeUnits .anyDigit
92121
93122pattern23 :: Regex
94123pattern23 = either (unsafePerformEffect <<< throw) identity
@@ -105,6 +134,9 @@ pattern23 = either (unsafePerformEffect <<< throw) identity
105134parseSkidoo :: Parser String (List String )
106135parseSkidoo = many $ string " skidoo"
107136
137+ parseSkidooRec :: Parser String (List String )
138+ parseSkidooRec = manyRec $ string " skidoo"
139+
108140patternSkidoo :: Regex
109141patternSkidoo = either (unsafePerformEffect <<< throw) identity
110142 $ regex " skidoo"
@@ -117,51 +149,55 @@ patternSkidoo = either (unsafePerformEffect <<< throw) identity
117149 , unicode: true
118150 }
119151
152+ htmlTableWrap :: String -> Effect Unit -> Effect Unit
153+ htmlTableWrap caption benchmark = do
154+ log " <td><b>"
155+ log caption
156+ log " </b>"
157+ log " <pre>"
158+ benchmark
159+ log " </pre></td>"
160+
120161main :: Effect Unit
121162main = do
122- -- log $ show $ runParser string23_2 parse23
123- -- log $ show $ Regex.match pattern23 string23_2
124- -- log $ show $ runParser stringSkidoo_2 parseSkidoo
125- -- log $ show $ Regex.match patternSkidoo stringSkidoo_2
126- log " runParser parse23"
127- benchWith 200
128- $ \_ -> runParser string23_10000 parse23
129- log " StringParser.runParser parse23Points"
130- benchWith 20
131- $ \_ -> StringParser .runParser parse23Points string23_10000
132- log " StringParser.runParser parse23Units"
133- benchWith 200
134- $ \_ -> StringParser .runParser parse23Units string23_10000
135- log " Regex.match pattern23"
136- benchWith 200
137- $ \_ -> Regex .match pattern23 string23_10000
138- log " runParser parseSkidoo"
139- benchWith 200
140- $ \_ -> runParser stringSkidoo_10000 parseSkidoo
141- log " Regex.match patternSkidoo"
142- benchWith 200
143- $ \_ -> Regex .match patternSkidoo stringSkidoo_10000
144-
145- log " runParser json smallJson"
146- benchWith 1000
163+ log " <tr>"
164+ htmlTableWrap " runParser parse23" $ benchWith 200
165+ $ \_ -> runParser string23_500 parse23
166+ htmlTableWrap " StringParser.runParser parse23Points" $ benchWith 20
167+ $ \_ -> StringParser .runParser parse23Points string23_500
168+ htmlTableWrap " StringParser.runParser parse23Units" $ benchWith 200
169+ $ \_ -> StringParser .runParser parse23Units string23_500
170+ htmlTableWrap " runParser parse23Rec" $ benchWith 200
171+ $ \_ -> runParser string23_500 parse23Rec
172+ htmlTableWrap " StringParser.runParser parse23PointsRec" $ benchWith 20
173+ $ \_ -> StringParser .runParser parse23PointsRec string23_500
174+ htmlTableWrap " StringParser.runParser parse23UnitsRec" $ benchWith 200
175+ $ \_ -> StringParser .runParser parse23UnitsRec string23_500
176+ htmlTableWrap " Regex.match pattern23" $ benchWith 200
177+ $ \_ -> Regex .match pattern23 string23_500
178+ htmlTableWrap " runParser parseSkidoo" $ benchWith 200
179+ $ \_ -> runParser stringSkidoo_1000 parseSkidoo
180+ htmlTableWrap " runParser parseSkidooRec" $ benchWith 200
181+ $ \_ -> runParser stringSkidoo_1000 parseSkidooRec
182+ htmlTableWrap " Regex.match patternSkidoo" $ benchWith 200
183+ $ \_ -> Regex .match patternSkidoo stringSkidoo_1000
184+ htmlTableWrap " runParser json smallJson" $ benchWith 1000
147185 $ \_ -> runParser smallJson BenchParsing .json
148-
149- log " StringParser.runParser json smallJson"
150- benchWith 1000
186+ htmlTableWrap " runTrampoline runParser json smallJson " $ benchWith 1000
187+ $ \_ -> runTrampoline $ runParserT smallJson BenchParsing .json
188+ htmlTableWrap " StringParser.runParser json smallJson " $ benchWith 500
151189 $ \_ -> StringParser .runParser BenchStringParser .json smallJson
152-
153- log " runParser json mediumJson"
154- benchWith 500
190+ htmlTableWrap " runParser json mediumJson" $ benchWith 500
155191 $ \_ -> runParser mediumJson BenchParsing .json
156-
157- log " StringParser.runParser json mediumJson"
158- benchWith 500
192+ htmlTableWrap " runTrampoline runParser json mediumJson " $ benchWith 500
193+ $ \_ -> runTrampoline $ runParserT mediumJson BenchParsing .json
194+ htmlTableWrap " StringParser.runParser json mediumJson " $ benchWith 1000
159195 $ \_ -> StringParser .runParser BenchStringParser .json mediumJson
160-
161- log " runParser json largeJson"
162- benchWith 100
196+ htmlTableWrap " runParser json largeJson" $ benchWith 100
163197 $ \_ -> runParser largeJson BenchParsing .json
164-
165- log " StringParser.runParser json largeJson"
166- benchWith 100
198+ htmlTableWrap " runTrampoline runParser json largeJson " $ benchWith 100
199+ $ \_ -> runTrampoline $ runParserT largeJson BenchParsing .json
200+ htmlTableWrap " StringParser.runParser json largeJson " $ benchWith 100
167201 $ \_ -> StringParser .runParser BenchStringParser .json largeJson
202+ log " </tr>"
203+
0 commit comments