From e2da585ecff9743e67f0a3c2b24246a58b1fac60 Mon Sep 17 00:00:00 2001 From: Nigro Simone Date: Fri, 31 Jul 2026 07:16:35 +0200 Subject: [PATCH] benchmark: add a large JSON body scenario The only scenario that exercises the body parsers, body-urlencoded, posts 57 bytes. uWS hands a body that small over in a single chunk, so the suite never measures the work of collecting a body that arrives in pieces, and changes to that path cannot show up in the results. Post 512kb of JSON instead, which is above the ~512kb chunk size uWS delivers bodies in, so the parser has to put several chunks together. --- benchmark/scenarios/body-json-512kb.js | 28 +++++++++++++++++++++++ benchmark/wrk-scripts/post-json-512kb.lua | 7 ++++++ 2 files changed, 35 insertions(+) create mode 100644 benchmark/scenarios/body-json-512kb.js create mode 100644 benchmark/wrk-scripts/post-json-512kb.lua diff --git a/benchmark/scenarios/body-json-512kb.js b/benchmark/scenarios/body-json-512kb.js new file mode 100644 index 00000000..1b8c6da6 --- /dev/null +++ b/benchmark/scenarios/body-json-512kb.js @@ -0,0 +1,28 @@ +'use strict'; + +// The other body-parser scenario posts 57 bytes, which uWS hands over in a single +// chunk, so it never exercises the accumulate path. This one is large enough to +// arrive in several chunks and makes the cost of collecting a body visible. +const PAD = 512 * 1024; + +module.exports = { + name: 'middlewares/body-json-512kb', + path: '/abc', + wrk: { + script: 'post-json-512kb.lua', + connections: 50 + }, + verify: { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ n: 1, pad: 'x'.repeat(PAD) }) + }, + setup(app, express) { + app.use(express.json({ limit: '10mb' })); + app.post('/abc', (req, res) => { + res.send(`${req.body.pad.length}`); + }); + } +}; diff --git a/benchmark/wrk-scripts/post-json-512kb.lua b/benchmark/wrk-scripts/post-json-512kb.lua new file mode 100644 index 00000000..41686fe4 --- /dev/null +++ b/benchmark/wrk-scripts/post-json-512kb.lua @@ -0,0 +1,7 @@ +wrk.method = "POST" +wrk.path = "/abc" +wrk.headers["Content-Type"] = "application/json" + +local kb = 1024 +local pad = string.rep("x", 512 * kb) +wrk.body = '{"n":1,"pad":"' .. pad .. '"}'