From a0a7a65cc3157744dda7f7272dd3e0a7bc5b2ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 10 Jun 2023 00:45:56 +0200 Subject: [PATCH] perf: optimize ByteString checks, hoist server rid getter (#19452) Further improves preact SSR and express benches by about 2k RPS. Ref https://github.com/denoland/deno/issues/19451 --- ext/http/00_serve.js | 2 +- ext/webidl/00_webidl.js | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js index a26c6604e0..422ce2fe31 100644 --- a/ext/http/00_serve.js +++ b/ext/http/00_serve.js @@ -682,8 +682,8 @@ function serveHttpOn(context, callback) { // Run the server const finished = (async () => { + const rid = context.serverRid; while (true) { - const rid = context.serverRid; let req; try { // Attempt to pull as many requests out of the queue as possible before awaiting. This API is diff --git a/ext/webidl/00_webidl.js b/ext/webidl/00_webidl.js index ca1c7c6064..9454dc3923 100644 --- a/ext/webidl/00_webidl.js +++ b/ext/webidl/00_webidl.js @@ -59,7 +59,6 @@ const { ReflectHas, ReflectOwnKeys, RegExpPrototypeTest, - RegExpPrototypeExec, SafeRegExp, SafeSet, SetPrototypeEntries, @@ -403,11 +402,19 @@ converters.DOMString = function (V, prefix, context, opts = {}) { return String(V); }; -// deno-lint-ignore no-control-regex -const IS_BYTE_STRING = new SafeRegExp(/^[\x00-\xFF]*$/); +function isByteString(input) { + for (let i = 0; i < input.length; i++) { + if (StringPrototypeCharCodeAt(input, i) > 255) { + // If a character code is greater than 255, it means the string is not a byte string. + return false; + } + } + return true; +} + converters.ByteString = (V, prefix, context, opts) => { const x = converters.DOMString(V, prefix, context, opts); - if (RegExpPrototypeExec(IS_BYTE_STRING, x) === null) { + if (!isByteString(x)) { throw makeException( TypeError, "is not a valid ByteString",