@@ -6,22 +6,23 @@ const path = require('node:path')
6
6
const { Writable } = require ( 'node:stream' )
7
7
const { isMainThread } = require ( 'node:worker_threads' )
8
8
9
- const { Pool, Client, fetch, Agent, setGlobalDispatcher } = require ( '..' )
9
+ const { Pool, Client, fetch, Agent, setGlobalDispatcher, util } = require ( '..' )
10
+
11
+ const { makeParallelRequests, printResults } = require ( './_util' )
10
12
11
13
let nodeFetch
12
14
const axios = require ( 'axios' )
13
15
let superagent
14
16
let got
15
17
16
- const util = require ( 'node:util' )
17
- const _request = require ( 'request ' )
18
- const request = util . promisify ( _request )
18
+ const { promisify } = require ( 'node:util' )
19
+ const assert = require ( 'node:assert ' )
20
+ const request = promisify ( require ( 'request' ) )
19
21
20
22
const iterations = ( parseInt ( process . env . SAMPLES , 10 ) || 10 ) + 1
21
23
const errorThreshold = parseInt ( process . env . ERROR_THRESHOLD , 10 ) || 3
22
24
const connections = parseInt ( process . env . CONNECTIONS , 10 ) || 50
23
25
const pipelining = parseInt ( process . env . PIPELINING , 10 ) || 10
24
- const parallelRequests = parseInt ( process . env . PARALLEL , 10 ) || 100
25
26
const headersTimeout = parseInt ( process . env . HEADERS_TIMEOUT , 10 ) || 0
26
27
const bodyTimeout = parseInt ( process . env . BODY_TIMEOUT , 10 ) || 0
27
28
const dest = { }
@@ -119,7 +120,8 @@ class SimpleRequest {
119
120
120
121
onConnect ( abort ) { }
121
122
122
- onHeaders ( statusCode , headers , resume ) {
123
+ onHeaders ( statusCode , rawHeaders , resume ) {
124
+ assert ( util . parseHeaders ( rawHeaders ) [ 'content-type' ] )
123
125
this . dst . on ( 'drain' , resume )
124
126
}
125
127
@@ -136,57 +138,11 @@ class SimpleRequest {
136
138
}
137
139
}
138
140
139
- function makeParallelRequests ( cb ) {
140
- const promises = new Array ( parallelRequests )
141
- for ( let i = 0 ; i < parallelRequests ; ++ i ) {
142
- promises [ i ] = new Promise ( cb )
143
- }
144
- return Promise . all ( promises )
145
- }
146
-
147
- function printResults ( results ) {
148
- // Sort results by least performant first, then compare relative performances and also printing padding
149
- let last
150
-
151
- const rows = Object . entries ( results )
152
- // If any failed, put on the top of the list, otherwise order by mean, ascending
153
- . sort ( ( a , b ) => ( ! a [ 1 ] . success ? - 1 : b [ 1 ] . mean - a [ 1 ] . mean ) )
154
- . map ( ( [ name , result ] ) => {
155
- if ( ! result . success ) {
156
- return {
157
- Tests : name ,
158
- Samples : result . size ,
159
- Result : 'Errored' ,
160
- Tolerance : 'N/A' ,
161
- 'Difference with Slowest' : 'N/A'
162
- }
163
- }
164
-
165
- // Calculate throughput and relative performance
166
- const { size, mean, standardError } = result
167
- const relative = last !== 0 ? ( last / mean - 1 ) * 100 : 0
168
-
169
- // Save the slowest for relative comparison
170
- if ( typeof last === 'undefined' ) {
171
- last = mean
172
- }
173
-
174
- return {
175
- Tests : name ,
176
- Samples : size ,
177
- Result : `${ ( ( parallelRequests * 1e9 ) / mean ) . toFixed ( 2 ) } req/sec` ,
178
- Tolerance : `± ${ ( ( standardError / mean ) * 100 ) . toFixed ( 2 ) } %` ,
179
- 'Difference with slowest' : relative > 0 ? `+ ${ relative . toFixed ( 2 ) } %` : '-'
180
- }
181
- } )
182
-
183
- return console . table ( rows )
184
- }
185
-
186
141
const experiments = {
187
142
'http - no keepalive' ( ) {
188
143
return makeParallelRequests ( resolve => {
189
144
http . get ( httpNoKeepAliveOptions , res => {
145
+ assert ( res . headers [ 'content-type' ] )
190
146
res
191
147
. pipe (
192
148
new Writable ( {
@@ -202,6 +158,7 @@ const experiments = {
202
158
'http - keepalive' ( ) {
203
159
return makeParallelRequests ( resolve => {
204
160
http . get ( httpKeepAliveOptions , res => {
161
+ assert ( res . headers [ 'content-type' ] )
205
162
res
206
163
. pipe (
207
164
new Writable ( {
@@ -217,8 +174,8 @@ const experiments = {
217
174
'undici - pipeline' ( ) {
218
175
return makeParallelRequests ( resolve => {
219
176
dispatcher
220
- . pipeline ( undiciOptions , data => {
221
- return data . body
177
+ . pipeline ( undiciOptions , ( { body } ) => {
178
+ return body
222
179
} )
223
180
. end ( )
224
181
. pipe (
@@ -288,9 +245,15 @@ if (process.env.PORT) {
288
245
} )
289
246
}
290
247
248
+ const axiosOptions = {
249
+ url : dest . url ,
250
+ method : 'GET' ,
251
+ responseType : 'stream' ,
252
+ httpAgent : axiosAgent
253
+ }
291
254
experiments . axios = ( ) => {
292
255
return makeParallelRequests ( resolve => {
293
- axios . get ( dest . url , { responseType : 'stream' , httpAgent : axiosAgent } ) . then ( res => {
256
+ axios . request ( axiosOptions ) . then ( res => {
294
257
res . data . pipe ( new Writable ( {
295
258
write ( chunk , encoding , callback ) {
296
259
callback ( )
@@ -300,26 +263,37 @@ if (process.env.PORT) {
300
263
} )
301
264
}
302
265
266
+ const gotOptions = {
267
+ url : dest . url ,
268
+ method : 'GET' ,
269
+ agent : {
270
+ http : gotAgent
271
+ } ,
272
+ // avoid body processing
273
+ isStream : true
274
+ }
303
275
experiments . got = ( ) => {
304
276
return makeParallelRequests ( resolve => {
305
- got . get ( dest . url , { agent : { http : gotAgent } } ) . then ( res => {
306
- res . pipe ( new Writable ( {
307
- write ( chunk , encoding , callback ) {
308
- callback ( )
309
- }
310
- } ) ) . on ( 'finish' , resolve )
311
- } ) . catch ( console . log )
277
+ got ( gotOptions ) . pipe ( new Writable ( {
278
+ write ( chunk , encoding , callback ) {
279
+ callback ( )
280
+ }
281
+ } ) ) . on ( 'finish' , resolve )
312
282
} )
313
283
}
314
284
285
+ const requestOptions = {
286
+ url : dest . url ,
287
+ method : 'GET' ,
288
+ agent : requestAgent ,
289
+ // avoid body toString
290
+ encoding : null
291
+ }
315
292
experiments . request = ( ) => {
316
293
return makeParallelRequests ( resolve => {
317
- request ( dest . url , { agent : requestAgent } ) . then ( res => {
318
- res . pipe ( new Writable ( {
319
- write ( chunk , encoding , callback ) {
320
- callback ( )
321
- }
322
- } ) ) . on ( 'finish' , resolve )
294
+ request ( requestOptions ) . then ( res => {
295
+ // already body consumed
296
+ resolve ( )
323
297
} ) . catch ( console . log )
324
298
} )
325
299
}
0 commit comments