Skip to content

Commit 5088696

Browse files
authored
Use paralellelRequests instead of connections to calculate req/sec in benchmarks (nodejs#2800)
* Use paralellelRequests instead of connections to calculate req/sec in benchmarks Signed-off-by: Matteo Collina <[email protected]> * fixup Signed-off-by: Matteo Collina <[email protected]> * Revert "fixup" This reverts commit afb3878. --------- Signed-off-by: Matteo Collina <[email protected]>
1 parent 34a138f commit 5088696

File tree

5 files changed

+36
-48
lines changed

5 files changed

+36
-48
lines changed

README.md

+23-15
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,31 @@ npm i undici
1717

1818
## Benchmarks
1919

20-
The benchmark is a simple `hello world` [example](benchmarks/benchmark.js) using a
21-
50 TCP connections with a pipelining depth of 10 running on Node 20.10.0.
20+
The benchmark is a simple `hello world` [example](benchmarks/benchmark.js) using:
21+
22+
* 50 TCP connections
23+
* A pipelining factor of 10 for undici
24+
* 200 parallel requests issued per iteration (sample)
25+
26+
The benchmark was run on Linux on top of Node 20.10.0.
2227

2328
```
24-
│ Tests │ Samples │ Result │ Tolerance │ Difference with slowest │
25-
|─────────────────────|─────────|─────────────────|───────────|─────────────────────────|
26-
│ got │ 45 │ 1661.71 req/sec │ ± 2.93 % │ - │
27-
│ node-fetch │ 20 │ 2164.81 req/sec │ ± 2.63 % │ + 30.28 % │
28-
│ undici - fetch │ 35 │ 2274.27 req/sec │ ± 2.70 % │ + 36.86 % │
29-
│ http - no keepalive │ 15 │ 2376.04 req/sec │ ± 2.99 % │ + 42.99 % │
30-
│ axios │ 25 │ 2612.93 req/sec │ ± 2.89 % │ + 57.24 % │
31-
│ request │ 40 │ 2712.19 req/sec │ ± 2.92 % │ + 63.22 % │
32-
│ http - keepalive │ 45 │ 4393.25 req/sec │ ± 2.86 % │ + 164.38 % │
33-
│ undici - pipeline │ 45 │ 5484.69 req/sec │ ± 2.87 % │ + 230.06 % │
34-
│ undici - request │ 55 │ 7773.98 req/sec │ ± 2.93 % │ + 367.83 % │
35-
│ undici - stream │ 70 │ 8425.96 req/sec │ ± 2.91 % │ + 407.07 % │
36-
│ undici - dispatch │ 50 │ 9488.99 req/sec │ ± 2.85 % │ + 471.04 % │
29+
┌─────────┬───────────────────────┬─────────┬────────────────────┬────────────┬─────────────────────────┐
30+
│ (index) │ Tests │ Samples │ Result │ Tolerance │ Difference with slowest │
31+
├─────────┼───────────────────────┼─────────┼────────────────────┼────────────┼─────────────────────────┤
32+
│ 0 │ 'got' │ 25 │ '3444.59 req/sec' │ '± 2.88 %' │ '-' │
33+
│ 1 │ 'node-fetch' │ 20 │ '4927.30 req/sec' │ '± 2.46 %' │ '+ 43.04 %' │
34+
│ 2 │ 'undici - fetch' │ 10 │ '5043.80 req/sec' │ '± 1.87 %' │ '+ 46.43 %' │
35+
│ 3 │ 'request' │ 35 │ '6389.13 req/sec' │ '± 2.93 %' │ '+ 85.48 %' │
36+
│ 4 │ 'axios' │ 25 │ '6920.61 req/sec' │ '± 2.76 %' │ '+ 100.91 %' │
37+
│ 5 │ 'http - no keepalive' │ 10 │ '9357.37 req/sec' │ '± 2.24 %' │ '+ 171.65 %' │
38+
│ 6 │ 'http - keepalive' │ 30 │ '9921.36 req/sec' │ '± 2.83 %' │ '+ 188.03 %' │
39+
│ 7 │ 'superagent' │ 10 │ '10118.35 req/sec' │ '± 2.18 %' │ '+ 193.75 %' │
40+
│ 8 │ 'undici - pipeline' │ 10 │ '17106.69 req/sec' │ '± 1.46 %' │ '+ 396.62 %' │
41+
│ 9 │ 'undici - request' │ 20 │ '21611.80 req/sec' │ '± 2.50 %' │ '+ 527.41 %' │
42+
│ 10 │ 'undici - stream' │ 10 │ '24282.13 req/sec' │ '± 1.94 %' │ '+ 604.94 %' │
43+
│ 11 │ 'undici - dispatch' │ 20 │ '24441.95 req/sec' │ '± 2.68 %' │ '+ 609.58 %' │
44+
└─────────┴───────────────────────┴─────────┴────────────────────┴────────────┴─────────────────────────┘
3745
```
3846

3947
## Quick Start

benchmarks/benchmark-http2.js

+6-31
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
'use strict'
22

3-
const { connect } = require('node:http2')
4-
const { createSecureContext } = require('node:tls')
53
const os = require('node:os')
64
const path = require('node:path')
75
const { readFileSync } = require('node:fs')
@@ -48,11 +46,6 @@ const httpsBaseOptions = {
4846
...dest
4947
}
5048

51-
const http2ClientOptions = {
52-
secureContext: createSecureContext({ ca }),
53-
servername
54-
}
55-
5649
const undiciOptions = {
5750
path: '/',
5851
method: 'GET',
@@ -113,7 +106,9 @@ class SimpleRequest {
113106
}
114107

115108
function makeParallelRequests (cb) {
116-
return Promise.all(Array.from(Array(parallelRequests)).map(() => new Promise(cb)))
109+
const res = Promise.all(Array.from(Array(parallelRequests)).map(() => new Promise(cb)))
110+
res.catch(console.error)
111+
return res
117112
}
118113

119114
function printResults (results) {
@@ -143,10 +138,12 @@ function printResults (results) {
143138
last = mean
144139
}
145140

141+
console.log(mean)
142+
146143
return {
147144
Tests: name,
148145
Samples: size,
149-
Result: `${((connections * 1e9) / mean).toFixed(2)} req/sec`,
146+
Result: `${((1e9 * parallelRequests) / mean).toFixed(2)} req/sec`,
150147
Tolerance: ${((standardError / mean) * 100).toFixed(2)} %`,
151148
'Difference with slowest': relative > 0 ? `+ ${relative.toFixed(2)} %` : '-'
152149
}
@@ -156,28 +153,6 @@ function printResults (results) {
156153
}
157154

158155
const experiments = {
159-
'http2 - request' () {
160-
return makeParallelRequests(resolve => {
161-
connect(dest.url, http2ClientOptions, (session) => {
162-
const headers = {
163-
':path': '/',
164-
':method': 'GET',
165-
':scheme': 'https',
166-
':authority': `localhost:${dest.port}`
167-
}
168-
169-
const request = session.request(headers)
170-
171-
request.pipe(
172-
new Writable({
173-
write (chunk, encoding, callback) {
174-
callback()
175-
}
176-
})
177-
).on('finish', resolve)
178-
})
179-
})
180-
},
181156
'undici - pipeline' () {
182157
return makeParallelRequests(resolve => {
183158
dispatcher

benchmarks/benchmark-https.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ function printResults (results) {
160160
return {
161161
Tests: name,
162162
Samples: size,
163-
Result: `${((connections * 1e9) / mean).toFixed(2)} req/sec`,
163+
Result: `${((parallelRequests * 1e9) / mean).toFixed(2)} req/sec`,
164164
Tolerance: ${((standardError / mean) * 100).toFixed(2)} %`,
165165
'Difference with slowest': relative > 0 ? `+ ${relative.toFixed(2)} %` : '-'
166166
}

benchmarks/benchmark.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ function printResults (results) {
175175
return {
176176
Tests: name,
177177
Samples: size,
178-
Result: `${((connections * 1e9) / mean).toFixed(2)} req/sec`,
178+
Result: `${((parallelRequests * 1e9) / mean).toFixed(2)} req/sec`,
179179
Tolerance: ${((standardError / mean) * 100).toFixed(2)} %`,
180180
'Difference with slowest': relative > 0 ? `+ ${relative.toFixed(2)} %` : '-'
181181
}

benchmarks/server.js

+5
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ if (cluster.isPrimary) {
2424
}
2525
} else {
2626
const buf = Buffer.alloc(64 * 1024, '_')
27+
let i = 0
2728
const server = createServer((req, res) => {
29+
i++
2830
setTimeout(function () {
2931
res.end(buf)
3032
}, timeout)
3133
}).listen(port)
3234
server.keepAliveTimeout = 600e3
35+
setInterval(() => {
36+
console.log(`Worker ${process.pid} processed ${i} requests`)
37+
}, 5000)
3338
}

0 commit comments

Comments
 (0)