carlos / todomvc-bakeoff Public

Clone
git clone https://amadan.net/carlos/todomvc-bakeoff

Plain git — no account needed to clone.

Download

Download this file

1{
2 "Slug": "haskell",
3 "Language": "Haskell",
4 "Status": "LIVE",
5 "URL": "https://todo-haskell-2.bfj.oncarlos.com",
6 "Version": "b9fbdff",
7 "Stack": "",
8 "Source": "https://amadan.net/carlos/todomvc-bakeoff?ref=main\u0026path=apps/haskell",
9 "BehaviourJSOn": {
10 "Passed": 35,
11 "Failed": 0,
12 "Skipped": 0
13 },
14 "BehaviourJSOff": {
15 "Passed": 32,
16 "Failed": 0,
17 "Skipped": 3
18 },
19 "TTFBEmpty": {
20 "N": 30,
21 "P50": 99.332,
22 "P95": 107.298,
23 "P99": 111.009,
24 "Min": 83.908,
25 "Max": 111.009
26 },
27 "TTFB50": {
28 "N": 30,
29 "P50": 98.459,
30 "P95": 110.62,
31 "P99": 168.219,
32 "Min": 89.266,
33 "Max": 168.219
34 },
35 "Wake": [
36 1364.09,
37 1394.227,
38 1342.436
39 ],
40 "Load": [
41 {
42 "Scenario": "read",
43 "Concurrency": 1,
44 "RPS": 26.59610993859711,
45 "P50Ms": 37.506243000000005,
46 "P95Ms": 42.345214999999996,
47 "P99Ms": 55.210443,
48 "ErrorRate": 0,
49 "Status": {
50 "200": 265
51 }
52 },
53 {
54 "Scenario": "read",
55 "Concurrency": 2,
56 "RPS": 50.69475714314678,
57 "P50Ms": 38.755004,
58 "P95Ms": 45.726567,
59 "P99Ms": 56.355788,
60 "ErrorRate": 0,
61 "Status": {
62 "200": 505
63 }
64 },
65 {
66 "Scenario": "read",
67 "Concurrency": 4,
68 "RPS": 104.18854732398793,
69 "P50Ms": 37.774133,
70 "P95Ms": 44.549024,
71 "P99Ms": 55.789260999999996,
72 "ErrorRate": 0,
73 "Status": {
74 "200": 1038
75 }
76 },
77 {
78 "Scenario": "read",
79 "Concurrency": 8,
80 "RPS": 200.02596464909874,
81 "P50Ms": 38.891755,
82 "P95Ms": 48.065269,
83 "P99Ms": 61.747381,
84 "ErrorRate": 0,
85 "Status": {
86 "200": 1994
87 }
88 },
89 {
90 "Scenario": "read",
91 "Concurrency": 16,
92 "RPS": 362.62808178567985,
93 "P50Ms": 41.568044,
94 "P95Ms": 58.232081,
95 "P99Ms": 80.397633,
96 "ErrorRate": 0,
97 "Status": {
98 "200": 3611
99 }
100 },
101 {
102 "Scenario": "read",
103 "Concurrency": 32,
104 "RPS": 391.3376172226424,
105 "P50Ms": 79.11072399999999,
106 "P95Ms": 106.98137700000001,
107 "P99Ms": 144.924763,
108 "ErrorRate": 0,
109 "Status": {
110 "200": 3882
111 }
112 },
113 {
114 "Scenario": "read",
115 "Concurrency": 64,
116 "RPS": 399.99541739816476,
117 "P50Ms": 158.280656,
118 "P95Ms": 188.15194599999998,
119 "P99Ms": 225.93614,
120 "ErrorRate": 0,
121 "Status": {
122 "200": 3937
123 }
124 },
125 {
126 "Scenario": "toggle",
127 "Concurrency": 1,
128 "RPS": 94.39117616182652,
129 "P50Ms": 9.829907,
130 "P95Ms": 15.140255,
131 "P99Ms": 17.012545,
132 "ErrorRate": 0,
133 "Status": {
134 "303": 943
135 }
136 },
137 {
138 "Scenario": "toggle",
139 "Concurrency": 2,
140 "RPS": 62.189142882619436,
141 "P50Ms": 31.007856,
142 "P95Ms": 36.883623,
143 "P99Ms": 42.004796,
144 "ErrorRate": 0,
145 "Status": {
146 "303": 620
147 }
148 },
149 {
150 "Scenario": "toggle",
151 "Concurrency": 4,
152 "RPS": 114.85210578752539,
153 "P50Ms": 34.145729,
154 "P95Ms": 39.691365,
155 "P99Ms": 42.286877000000004,
156 "ErrorRate": 0,
157 "Status": {
158 "303": 1145
159 }
160 },
161 {
162 "Scenario": "toggle",
163 "Concurrency": 8,
164 "RPS": 223.75596701849923,
165 "P50Ms": 34.765794,
166 "P95Ms": 39.601362,
167 "P99Ms": 44.554303000000004,
168 "ErrorRate": 0,
169 "Status": {
170 "303": 2230
171 }
172 },
173 {
174 "Scenario": "toggle",
175 "Concurrency": 16,
176 "RPS": 432.6315926775869,
177 "P50Ms": 36.019937,
178 "P95Ms": 42.519154,
179 "P99Ms": 61.721464,
180 "ErrorRate": 0,
181 "Status": {
182 "303": 4313
183 }
184 },
185 {
186 "Scenario": "toggle",
187 "Concurrency": 32,
188 "RPS": 862.4576009191986,
189 "P50Ms": 35.808892,
190 "P95Ms": 45.280590000000004,
191 "P99Ms": 68.382225,
192 "ErrorRate": 0,
193 "Status": {
194 "303": 8594
195 }
196 },
197 {
198 "Scenario": "toggle",
199 "Concurrency": 64,
200 "RPS": 780.1442624533769,
201 "P50Ms": 60.939885,
202 "P95Ms": 178.966504,
203 "P99Ms": 239.56328,
204 "ErrorRate": 0,
205 "Status": {
206 "303": 7739
207 }
208 },
209 {
210 "Scenario": "toggle",
211 "Concurrency": 128,
212 "RPS": 1813.0549918620309,
213 "P50Ms": 49.445799,
214 "P95Ms": 201.391374,
215 "P99Ms": 274.141735,
216 "ErrorRate": 0.4451910262105731,
217 "Status": {
218 "303": 9991,
219 "503": 8017
220 }
221 },
222 {
223 "Scenario": "read-after",
224 "Concurrency": 1,
225 "RPS": 26.9955735115153,
226 "P50Ms": 37.093659,
227 "P95Ms": 42.204928,
228 "P99Ms": 50.499763,
229 "ErrorRate": 0,
230 "Status": {
231 "200": 269
232 }
233 },
234 {
235 "Scenario": "read-after",
236 "Concurrency": 2,
237 "RPS": 50.79291338796198,
238 "P50Ms": 38.764284,
239 "P95Ms": 46.634456,
240 "P99Ms": 53.920227000000004,
241 "ErrorRate": 0,
242 "Status": {
243 "200": 506
244 }
245 },
246 {
247 "Scenario": "read-after",
248 "Concurrency": 4,
249 "RPS": 238.76902860074694,
250 "P50Ms": 15.970498999999998,
251 "P95Ms": 23.360366,
252 "P99Ms": 32.031116,
253 "ErrorRate": 0,
254 "Status": {
255 "200": 2384
256 }
257 },
258 {
259 "Scenario": "read-after",
260 "Concurrency": 8,
261 "RPS": 368.7594607974367,
262 "P50Ms": 20.246022999999997,
263 "P95Ms": 33.163141,
264 "P99Ms": 50.387125999999995,
265 "ErrorRate": 0,
266 "Status": {
267 "200": 3680
268 }
269 },
270 {
271 "Scenario": "read-after",
272 "Concurrency": 16,
273 "RPS": 390.6594583065769,
274 "P50Ms": 38.311910999999995,
275 "P95Ms": 59.198389,
276 "P99Ms": 96.509428,
277 "ErrorRate": 0,
278 "Status": {
279 "200": 3892
280 }
281 },
282 {
283 "Scenario": "read-after",
284 "Concurrency": 32,
285 "RPS": 368.5312716354635,
286 "P50Ms": 81.38664800000001,
287 "P95Ms": 121.239345,
288 "P99Ms": 191.46308100000002,
289 "ErrorRate": 0,
290 "Status": {
291 "200": 3658
292 }
293 }
294 ],
295 "Weight": {
296 "HTMLBytes": 36847,
297 "JSBytes": 4183
298 },
299 "Memory": {
300 "IdleKB": 11392,
301 "PeakKB": 78476,
302 "AfterKB": 40420
303 },
304 "Code": {
305 "Server": 685,
306 "Templates": 0,
307 "JS": 113,
308 "Tests": 152,
309 "Deps": 10
310 },
311 "Build": {
312 "ColdSeconds": 1146.223358787,
313 "WarmSeconds": 104.433057706,
314 "EditSeconds": 26.633811235,
315 "Bytes": 28726912,
316 "Host": "DOCS-T1",
317 "ColdRuns": 1,
318 "Runs": 3
319 },
320 "TokensBuild": {
321 "Input": 140,
322 "Output": 79279,
323 "CacheRead": 7860561,
324 "CacheWrite": 161967,
325 "Turns": 73,
326 "Seconds": 3280.837,
327 "CostUSD": 4.4539882
328 },
329 "TokensFix": {
330 "Input": 20,
331 "Output": 6470,
332 "CacheRead": 1823381,
333 "CacheWrite": 13744,
334 "Turns": 10,
335 "Seconds": 238.426,
336 "CostUSD": 0.6041082000000007
337 },
338 "TokensSecurity": {
339 "Input": 0,
340 "Output": 0,
341 "CacheRead": 0,
342 "CacheWrite": 0,
343 "Turns": 0,
344 "Seconds": 0,
345 "CostUSD": 0
346 },
347 "TokensReview": {
348 "Input": 664393,
349 "Output": 3522,
350 "CacheRead": 573184,
351 "CacheWrite": 0,
352 "Turns": 2,
353 "Seconds": 0,
354 "CostUSD": 0
355 },
356 "Readability": {
357 "Naming": 4,
358 "Structure": 4,
359 "Traceability": 5,
360 "Errors": 3,
361 "Comments": 5,
362 "Overall": 8,
363 "Notes": "Strongest: tracing a request is effortless. The toggle route goes from the pathInfo case through the `post` helper to Db.toggleTodo and back to Html.fragment, with the Bool-means-found contract stated at each end. Comments consistently explain why (WAL via query_, getrandom over /dev, single connection, the `swapping` flag) without restating code. Weakest: error handling is mostly implicit. Database exceptions reach Warp's default 500 with no logging; migrate silently assumes version 0 on an odd PRAGMA result; the getrandom loop retries on any negative result, not only EINTR; app.js hides every failure behind location.reload(). Minor: `app`'s where-block is long and the multiway-if in `post` is dense; `common`, `with`, `f`, `v` are terse names."
364 },
365 "ReviewFindings": null,
366 "Notes": null
367}
368