From 2304a695f5c6cea9054863ea229aa0cbd82103c6 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Mon, 4 Oct 2021 15:39:32 +0200 Subject: [PATCH] perf(webidl): optimize createRecordConverter() (#12286) Cuts self-time by ~6x, 172ns/iter => 22ns/iter benched on 1M Response builds / HeadersInit calls --- ext/webidl/00_webidl.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ext/webidl/00_webidl.js b/ext/webidl/00_webidl.js index 08de5aba6605f..1bf9d776f4f2b 100644 --- a/ext/webidl/00_webidl.js +++ b/ext/webidl/00_webidl.js @@ -9,6 +9,7 @@ "use strict"; ((window) => { + const core = window.Deno.core; const { ArrayBuffer, ArrayBufferIsView, @@ -48,6 +49,7 @@ ObjectGetOwnPropertyDescriptor, ObjectGetOwnPropertyDescriptors, ObjectGetPrototypeOf, + ObjectPrototypeHasOwnProperty, ObjectIs, PromisePrototypeThen, PromiseReject, @@ -844,8 +846,21 @@ opts, ); } - const keys = ReflectOwnKeys(V); const result = {}; + // Fast path for common case (not a Proxy) + if (!core.isProxy(V)) { + for (const key in V) { + if (!ObjectPrototypeHasOwnProperty(V, key)) { + continue; + } + const typedKey = keyConverter(key, opts); + const value = V[key]; + const typedValue = valueConverter(value, opts); + result[typedKey] = typedValue; + } + } + // Slow path if Proxy (e.g: in WPT tests) + const keys = ReflectOwnKeys(V); for (const key of keys) { const desc = ObjectGetOwnPropertyDescriptor(V, key); if (desc !== undefined && desc.enumerable === true) {