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": "ocaml",
3 "Language": "OCaml",
4 "Status": "LIVE",
5 "URL": "https://todo-ocaml-2.bfj.oncarlos.com",
6 "Version": "d803224",
7 "Stack": "",
8 "Source": "https://amadan.net/carlos/todomvc-bakeoff?ref=main\u0026path=apps/ocaml",
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": 51.659,
22 "P95": 58.82,
23 "P99": 60.574,
24 "Min": 45.08,
25 "Max": 60.574
26 },
27 "TTFB50": {
28 "N": 30,
29 "P50": 52.9,
30 "P95": 75.3,
31 "P99": 125.31,
32 "Min": 41.961,
33 "Max": 125.31
34 },
35 "Wake": [
36 1183.677,
37 1296.171,
38 1285.662
39 ],
40 "Load": [
41 {
42 "Scenario": "read",
43 "Concurrency": 1,
44 "RPS": 76.49275580710622,
45 "P50Ms": 12.132339,
46 "P95Ms": 17.773377,
47 "P99Ms": 21.198332,
48 "ErrorRate": 0,
49 "Status": {
50 "200": 764
51 }
52 },
53 {
54 "Scenario": "read",
55 "Concurrency": 2,
56 "RPS": 135.78443915758632,
57 "P50Ms": 14.967083,
58 "P95Ms": 19.172369000000003,
59 "P99Ms": 23.660912999999997,
60 "ErrorRate": 0,
61 "Status": {
62 "200": 1356
63 }
64 },
65 {
66 "Scenario": "read",
67 "Concurrency": 4,
68 "RPS": 256.95806647352026,
69 "P50Ms": 15.260728,
70 "P95Ms": 20.263771,
71 "P99Ms": 26.014457,
72 "ErrorRate": 0,
73 "Status": {
74 "200": 2566
75 }
76 },
77 {
78 "Scenario": "read",
79 "Concurrency": 8,
80 "RPS": 492.85122625980637,
81 "P50Ms": 15.869159000000002,
82 "P95Ms": 22.015221,
83 "P99Ms": 26.571461,
84 "ErrorRate": 0,
85 "Status": {
86 "200": 4921
87 }
88 },
89 {
90 "Scenario": "read",
91 "Concurrency": 16,
92 "RPS": 828.1460486433324,
93 "P50Ms": 17.966468,
94 "P95Ms": 29.617344,
95 "P99Ms": 43.507917,
96 "ErrorRate": 0,
97 "Status": {
98 "200": 8267
99 }
100 },
101 {
102 "Scenario": "read",
103 "Concurrency": 32,
104 "RPS": 789.7537081554362,
105 "P50Ms": 33.62263,
106 "P95Ms": 83.737086,
107 "P99Ms": 130.308392,
108 "ErrorRate": 0,
109 "Status": {
110 "200": 7867
111 }
112 },
113 {
114 "Scenario": "read",
115 "Concurrency": 64,
116 "RPS": 924.1786622729835,
117 "P50Ms": 66.602672,
118 "P95Ms": 114.55368200000001,
119 "P99Ms": 146.556476,
120 "ErrorRate": 0,
121 "Status": {
122 "200": 9179
123 }
124 },
125 {
126 "Scenario": "read",
127 "Concurrency": 128,
128 "RPS": 991.611349175018,
129 "P50Ms": 126.64852600000002,
130 "P95Ms": 207.557649,
131 "P99Ms": 270.630206,
132 "ErrorRate": 0,
133 "Status": {
134 "200": 9791
135 }
136 },
137 {
138 "Scenario": "read",
139 "Concurrency": 256,
140 "RPS": 8969.860389280351,
141 "P50Ms": 19.927958999999998,
142 "P95Ms": 82.329991,
143 "P99Ms": 127.97465899999999,
144 "ErrorRate": 0.8957115554413063,
145 "Status": {
146 "200": 9331,
147 "503": 80142
148 }
149 },
150 {
151 "Scenario": "toggle",
152 "Concurrency": 1,
153 "RPS": 31.888753656126454,
154 "P50Ms": 30.738936000000002,
155 "P95Ms": 34.59509,
156 "P99Ms": 37.999565,
157 "ErrorRate": 0,
158 "Status": {
159 "303": 318
160 }
161 },
162 {
163 "Scenario": "toggle",
164 "Concurrency": 2,
165 "RPS": 63.09187247344204,
166 "P50Ms": 30.806395000000002,
167 "P95Ms": 36.620787,
168 "P99Ms": 43.047184,
169 "ErrorRate": 0,
170 "Status": {
171 "303": 629
172 }
173 },
174 {
175 "Scenario": "toggle",
176 "Concurrency": 4,
177 "RPS": 124.08132513395665,
178 "P50Ms": 30.81785,
179 "P95Ms": 37.607333,
180 "P99Ms": 61.74071,
181 "ErrorRate": 0,
182 "Status": {
183 "303": 1238
184 }
185 },
186 {
187 "Scenario": "toggle",
188 "Concurrency": 8,
189 "RPS": 237.36710293715328,
190 "P50Ms": 33.29061299999999,
191 "P95Ms": 38.181529999999995,
192 "P99Ms": 42.025779,
193 "ErrorRate": 0,
194 "Status": {
195 "303": 2366
196 }
197 },
198 {
199 "Scenario": "toggle",
200 "Concurrency": 16,
201 "RPS": 460.81160803896915,
202 "P50Ms": 34.166177999999995,
203 "P95Ms": 39.529419000000004,
204 "P99Ms": 52.621012,
205 "ErrorRate": 0,
206 "Status": {
207 "303": 4593
208 }
209 },
210 {
211 "Scenario": "toggle",
212 "Concurrency": 32,
213 "RPS": 887.0204034015048,
214 "P50Ms": 34.534487000000006,
215 "P95Ms": 42.144569,
216 "P99Ms": 79.96372,
217 "ErrorRate": 0,
218 "Status": {
219 "303": 8839
220 }
221 },
222 {
223 "Scenario": "toggle",
224 "Concurrency": 64,
225 "RPS": 1057.6661271736937,
226 "P50Ms": 44.443495999999996,
227 "P95Ms": 140.51767800000002,
228 "P99Ms": 177.552036,
229 "ErrorRate": 0,
230 "Status": {
231 "303": 10515
232 }
233 },
234 {
235 "Scenario": "toggle",
236 "Concurrency": 128,
237 "RPS": 1362.4340145959552,
238 "P50Ms": 62.144081,
239 "P95Ms": 254.80678899999998,
240 "P99Ms": 412.619422,
241 "ErrorRate": 0.2856507889473294,
242 "Status": {
243 "303": 9643,
244 "503": 3856
245 }
246 },
247 {
248 "Scenario": "read-after",
249 "Concurrency": 1,
250 "RPS": 27.69546377660531,
251 "P50Ms": 36.003156000000004,
252 "P95Ms": 40.474782,
253 "P99Ms": 61.204169,
254 "ErrorRate": 0,
255 "Status": {
256 "200": 276
257 }
258 },
259 {
260 "Scenario": "read-after",
261 "Concurrency": 2,
262 "RPS": 52.19290268383009,
263 "P50Ms": 37.93591,
264 "P95Ms": 42.595862999999994,
265 "P99Ms": 48.882318,
266 "ErrorRate": 0,
267 "Status": {
268 "200": 520
269 }
270 },
271 {
272 "Scenario": "read-after",
273 "Concurrency": 4,
274 "RPS": 108.48845981130873,
275 "P50Ms": 36.692753,
276 "P95Ms": 41.509272,
277 "P99Ms": 45.983484,
278 "ErrorRate": 0,
279 "Status": {
280 "200": 1081
281 }
282 },
283 {
284 "Scenario": "read-after",
285 "Concurrency": 8,
286 "RPS": 213.48600927977625,
287 "P50Ms": 36.586635,
288 "P95Ms": 42.996452999999995,
289 "P99Ms": 72.03171499999999,
290 "ErrorRate": 0,
291 "Status": {
292 "200": 2127
293 }
294 },
295 {
296 "Scenario": "read-after",
297 "Concurrency": 16,
298 "RPS": 413.3553858724856,
299 "P50Ms": 37.597107,
300 "P95Ms": 45.717586999999995,
301 "P99Ms": 61.104552999999996,
302 "ErrorRate": 0,
303 "Status": {
304 "200": 4120
305 }
306 },
307 {
308 "Scenario": "read-after",
309 "Concurrency": 32,
310 "RPS": 742.6962395042211,
311 "P50Ms": 40.184226,
312 "P95Ms": 58.782751000000005,
313 "P99Ms": 82.288609,
314 "ErrorRate": 0,
315 "Status": {
316 "200": 7397
317 }
318 },
319 {
320 "Scenario": "read-after",
321 "Concurrency": 64,
322 "RPS": 713.3670865858147,
323 "P50Ms": 69.819616,
324 "P95Ms": 196.194665,
325 "P99Ms": 332.292778,
326 "ErrorRate": 0,
327 "Status": {
328 "200": 7071
329 }
330 },
331 {
332 "Scenario": "read-after",
333 "Concurrency": 128,
334 "RPS": 3047.9283526262448,
335 "P50Ms": 21.520699,
336 "P95Ms": 109.87831000000001,
337 "P99Ms": 163.49684100000002,
338 "ErrorRate": 0.6972561678579663,
339 "Status": {
340 "200": 9191,
341 "503": 21168
342 }
343 }
344 ],
345 "Weight": {
346 "HTMLBytes": 42587,
347 "JSBytes": 3685
348 },
349 "Memory": {
350 "IdleKB": 10908,
351 "PeakKB": 17388,
352 "AfterKB": 17388
353 },
354 "Code": {
355 "Server": 597,
356 "Templates": 0,
357 "JS": 100,
358 "Tests": 206,
359 "Deps": 9
360 },
361 "Build": {
362 "ColdSeconds": 1097.444331791,
363 "WarmSeconds": 9.975881839,
364 "EditSeconds": 3.303059353,
365 "Bytes": 8235224,
366 "Host": "DOCS-T1",
367 "ColdRuns": 1,
368 "Runs": 3
369 },
370 "TokensBuild": {
371 "Input": 202,
372 "Output": 83667,
373 "CacheRead": 12568981,
374 "CacheWrite": 175533,
375 "Turns": 103,
376 "Seconds": 1110.2859999999998,
377 "CostUSD": 5.5922082
378 },
379 "TokensFix": {
380 "Input": 62,
381 "Output": 23981,
382 "CacheRead": 6448874,
383 "CacheWrite": 35642,
384 "Turns": 31,
385 "Seconds": 364.49199999999996,
386 "CostUSD": 2.0547788000000002
387 },
388 "TokensSecurity": {
389 "Input": 0,
390 "Output": 0,
391 "CacheRead": 0,
392 "CacheWrite": 0,
393 "Turns": 0,
394 "Seconds": 0,
395 "CostUSD": 0
396 },
397 "TokensReview": {
398 "Input": 794733,
399 "Output": 4130,
400 "CacheRead": 689664,
401 "CacheWrite": 0,
402 "Turns": 2,
403 "Seconds": 0,
404 "CostUSD": 0
405 },
406 "Readability": {
407 "Naming": 4,
408 "Structure": 4,
409 "Traceability": 5,
410 "Errors": 4,
411 "Comments": 5,
412 "Overall": 8,
413 "Notes": "Strongest: a toggle is trivially traceable (handle → action_of_path → post → perform → Store.toggle → View.fragment or 303), helped by App being server-independent and each module having one clear job. Comments are nearly all 'why' (Budget rationale, cookie age, migration rule, CSP hash, JS render invariants) with no noise. Weakest: handle's `filter p \u003c\u003e None ... Option.get (filter p)` double evaluation is clunky and hides intent; Store errors surface only as failwith exceptions caught by run_server's generic logger, and user_version's exec result is ignored; main.ml's Budget/connection plumbing and nested try blocks take effort to follow; a few terse names (change, shows, done_, go) need a moment."
414 },
415 "ReviewFindings": [
416 "[correctness] `apps/ocaml/static/app.js:14` — Filter navigation can discard queued edits. With a toggle request pending, edit another item and click “Active”: blur queues the save, but the ordinary filter link immediately unloads the page before that save runs. The changed title is lost. Wait for pending mutations before navigating between filters."
417 ],
418 "Notes": null
419}
420