1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-24 08:09:08 -05:00

perf(ext/node): optimize http headers (#20163)

This PR optimizes Node's `IncomingMessageForServer.headers` by replacing
`Object.fromEntries()` with a loop and `headers.entries` with
`headersEntries` which returns the internal array directly instead of an
iterator

## Benchmarks

Using `wrk` with 5 headers

```
wrk -d 10s --latency -H "X-Deno: true" -H "Accept: application/json" -H "X-Foo: bar" -H "User-Agent: wrk" -H "Accept-Encoding: gzip, br" http://127.0.0.1:3000
```

**this PR**

```
Running 10s test @ http://127.0.0.1:3000
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   167.53us  136.89us   2.75ms   97.33%
    Req/Sec    31.98k     1.38k   36.39k    70.30%
  Latency Distribution
     50%  134.00us
     75%  191.00us
     90%  234.00us
     99%  544.00us
  642548 requests in 10.10s, 45.96MB read
Requests/sec:  63620.36
Transfer/sec:      4.55MB
```

**main**

```
Running 10s test @ http://127.0.0.1:3000
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   181.31us  132.54us   3.79ms   97.13%
    Req/Sec    29.21k     1.45k   32.93k    79.21%
  Latency Distribution
     50%  148.00us
     75%  198.00us
     90%  261.00us
     99%  545.00us
  586939 requests in 10.10s, 41.98MB read
Requests/sec:  58114.01
Transfer/sec:      4.16MB
```

```js
import express from "npm:express";

const app = express();
app.get("/", function (req, res) {
  req.headers;
  res.end();
});
app.listen(3000);
```
This commit is contained in:
Marcos Casagrande 2023-08-15 16:59:35 +02:00 committed by Divy Srivastava
parent 7895d154c3
commit 578936b490
2 changed files with 16 additions and 1 deletions

View file

@ -508,6 +508,14 @@ function guardFromHeaders(headers) {
return headers[_guard];
}
/**
* @param {Headers} headers
* @returns {[string, string][]}
*/
function headersEntries(headers) {
return headers[_iterableHeaders];
}
export {
fillHeaders,
getDecodeSplitHeader,
@ -515,5 +523,6 @@ export {
guardFromHeaders,
headerListFromHeaders,
Headers,
headersEntries,
headersFromHeaderList,
};

View file

@ -55,6 +55,7 @@ import {
import { getTimerDuration } from "ext:deno_node/internal/timers.mjs";
import { serve, upgradeHttpRaw } from "ext:deno_http/00_serve.js";
import { createHttpClient } from "ext:deno_fetch/22_http_client.js";
import { headersEntries } from "ext:deno_fetch/20_headers.js";
import { timerId } from "ext:deno_web/03_abort_signal.js";
import { clearTimeout as webClearTimeout } from "ext:deno_web/02_timers.js";
import { TcpConn } from "ext:deno_net/01_net.js";
@ -1486,7 +1487,12 @@ export class IncomingMessageForServer extends NodeReadable {
get headers() {
if (!this.#headers) {
this.#headers = Object.fromEntries(this.#req.headers.entries());
this.#headers = {};
const entries = headersEntries(this.#req.headers);
for (let i = 0; i < entries.length; i++) {
const entry = entries[i];
this.#headers[entry[0]] = entry[1];
}
}
return this.#headers;
}