diff options
author | Marcos Casagrande <marcos@denode.com> | 2023-09-22 04:06:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-21 20:06:42 -0600 |
commit | 65a94a6176e3a76ca52d0666cf882689ac0b5b9c (patch) | |
tree | 745255a0ed69773f3118087b67d7137604c131f9 /ext/fetch/23_response.js | |
parent | 142449ecab20006c5cfd15462814650596bc034d (diff) |
perf(ext/fetch): use new instead of createBranded (#20624)
This PR optimizes `fromInner*` methods of `Request` / `Header` /
`Response` used by `Deno.serve` and `fetch` by using `new` instead of
`ObjectCreate` from `createBranded`.
The "brand" is created by passing `webidl.brand` to the constructor
instead.
https://github.com/denoland/deno/blob/142449ecab20006c5cfd15462814650596bc034d/ext/webidl/00_webidl.js#L1001-L1005
### Benchmark
```js
const createBranded = Symbol("create branded");
const brand = Symbol("brand");
class B {
constructor(init) {
if (init === createBranded) {
this[brand] = brand;
}
}
}
Deno.bench("Object.create(protoype)", () => {
Object.create(B.prototype);
});
Deno.bench("new Class", () => {
new B(createBranded);
});
```
```
cpu: 13th Gen Intel(R) Core(TM) i9-13900H
runtime: deno 1.37.0 (x86_64-unknown-linux-gnu)
benchmark time (avg) iter/s (min … max) p75 p99 p995
----------------------------------------------------------------------------- -----------------------------
Object.create(protoype) 8.74 ns/iter 114,363,610.3 (7.32 ns … 26.02 ns) 8.65 ns 13.39 ns 14.47 ns
new Class 3.05 ns/iter 328,271,012.2 (2.78 ns … 9.1 ns) 3.06 ns 3.46 ns 3.5 ns
```
Diffstat (limited to 'ext/fetch/23_response.js')
-rw-r--r-- | ext/fetch/23_response.js | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/ext/fetch/23_response.js b/ext/fetch/23_response.js index dc4e75434..73a90166d 100644 --- a/ext/fetch/23_response.js +++ b/ext/fetch/23_response.js @@ -60,6 +60,7 @@ const _response = Symbol("response"); const _headers = Symbol("headers"); const _mimeType = Symbol("mime type"); const _body = Symbol("body"); +const _brand = webidl.brand; /** * @typedef InnerResponse @@ -305,6 +306,11 @@ class Response { * @param {ResponseInit} init */ constructor(body = null, init = undefined) { + if (body === _brand) { + this[_brand] = _brand; + return; + } + const prefix = "Failed to construct 'Response'"; body = webidl.converters["BodyInit_DOMString?"](body, prefix, "Argument 1"); init = webidl.converters["ResponseInit_fast"](init, prefix, "Argument 2"); @@ -320,7 +326,7 @@ class Response { bodyWithType = extractBody(body); } initializeAResponse(this, init, bodyWithType); - this[webidl.brand] = webidl.brand; + this[_brand] = _brand; } /** @@ -489,7 +495,7 @@ function toInnerResponse(response) { * @returns {Response} */ function fromInnerResponse(inner, guard) { - const response = webidl.createBranded(Response); + const response = new Response(_brand); response[_response] = inner; response[_headers] = headersFromHeaderList(inner.headerList, guard); return response; |