1
1
-- | # Benchmarking
2
2
-- |
3
- -- | spago -x spago-dev.dhall run --main Bench.Main
3
+ -- | spago -x spago-dev.dhall run --main Bench.Main --node-args '--expose-gc'
4
4
-- |
5
5
-- | This benchmark suite is intended to guide changes to this package so that
6
6
-- | we can compare the benchmarks of different commits.
10
10
-- | than Regex?” Answer: approximately 100×. The Regex benchmarks also give
11
11
-- | us a rough way to calibrate benchmarks run on different platforms.
12
12
-- |
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
+ -- |
13
25
-- | # Profiling
14
26
-- |
15
27
-- | https://nodejs.org/en/docs/guides/simple-profiling/
@@ -44,6 +56,8 @@ import Prelude
44
56
import Bench.Json.Parsing as BenchParsing
45
57
import Bench.Json.StringParser as BenchStringParser
46
58
import Bench.Json.TestData (largeJson , mediumJson , smallJson )
59
+ import Control.Monad.Trampoline (runTrampoline )
60
+ import Control.Monad.Free (liftF )
47
61
import Data.Array (fold , replicate )
48
62
import Data.Either (either )
49
63
import Data.List (many , manyRec )
@@ -56,7 +70,7 @@ import Effect.Console (log)
56
70
import Effect.Exception (throw )
57
71
import Effect.Unsafe (unsafePerformEffect )
58
72
import Performance.Minibench (benchWith )
59
- import Text.Parsing.Parser (Parser , runParser )
73
+ import Text.Parsing.Parser (Parser , runParser , runParserT )
60
74
import Text.Parsing.Parser.String (string )
61
75
import Text.Parsing.Parser.String.Basic (digit )
62
76
import StringParser as StringParser
@@ -69,26 +83,41 @@ string23 = "23"
69
83
string23_2 :: String
70
84
string23_2 = fold $ replicate 2 string23
71
85
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
74
91
75
92
stringSkidoo :: String
76
93
stringSkidoo = " skidoo"
77
94
78
95
stringSkidoo_2 :: String
79
96
stringSkidoo_2 = fold $ replicate 2 stringSkidoo
80
97
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
83
103
84
104
parse23 :: Parser String (List Char )
85
- parse23 = manyRec digit
105
+ parse23 = many digit
86
106
87
107
parse23Points :: StringParser.Parser (List Char )
88
- parse23Points = manyRec StringParser.CodePoints .anyDigit
108
+ parse23Points = many StringParser.CodePoints .anyDigit
89
109
90
110
parse23Units :: 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
92
121
93
122
pattern23 :: Regex
94
123
pattern23 = either (unsafePerformEffect <<< throw) identity
@@ -105,6 +134,9 @@ pattern23 = either (unsafePerformEffect <<< throw) identity
105
134
parseSkidoo :: Parser String (List String )
106
135
parseSkidoo = many $ string " skidoo"
107
136
137
+ parseSkidooRec :: Parser String (List String )
138
+ parseSkidooRec = manyRec $ string " skidoo"
139
+
108
140
patternSkidoo :: Regex
109
141
patternSkidoo = either (unsafePerformEffect <<< throw) identity
110
142
$ regex " skidoo"
@@ -117,51 +149,55 @@ patternSkidoo = either (unsafePerformEffect <<< throw) identity
117
149
, unicode: true
118
150
}
119
151
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
+
120
161
main :: Effect Unit
121
162
main = 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
147
185
$ \_ -> 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
151
189
$ \_ -> StringParser .runParser BenchStringParser .json smallJson
152
-
153
- log " runParser json mediumJson"
154
- benchWith 500
190
+ htmlTableWrap " runParser json mediumJson" $ benchWith 500
155
191
$ \_ -> 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
159
195
$ \_ -> StringParser .runParser BenchStringParser .json mediumJson
160
-
161
- log " runParser json largeJson"
162
- benchWith 100
196
+ htmlTableWrap " runParser json largeJson" $ benchWith 100
163
197
$ \_ -> 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
167
201
$ \_ -> StringParser .runParser BenchStringParser .json largeJson
202
+ log " </tr>"
203
+
0 commit comments