From c40ab1114f4d1d887a970f74e9cd84975dd63d52 Mon Sep 17 00:00:00 2001 From: tsctx <91457664+tsctx@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:54:09 +0900 Subject: [PATCH] chore: update headers iterator benchmark --- benchmarks/headers.mjs | 56 +++++++++++++++++---------- lib/fetch/headers.js | 1 + test/fetch/headerslist-sortedarray.js | 4 +- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/benchmarks/headers.mjs b/benchmarks/headers.mjs index 2b3bc985c65..545d3f2bd8f 100644 --- a/benchmarks/headers.mjs +++ b/benchmarks/headers.mjs @@ -1,4 +1,4 @@ -import { bench, run } from 'mitata' +import { bench, group, run } from 'mitata' import { Headers } from '../lib/fetch/headers.js' const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' @@ -12,32 +12,46 @@ function generateAsciiString (length) { return result } -const headers = new Headers( - Array.from(Array(32), () => generateAsciiString(12)).map((v) => [v, '']) -) +const settings = { + 'fast-path (tiny array)': 4, + 'fast-path (small array)': 8, + 'fast-path (middle array)': 16, + 'fast-path': 32, + 'slow-patch': 64 +} + +for (const [name, length] of Object.entries(settings)) { + const headers = new Headers( + Array.from(Array(length), () => [generateAsciiString(12), '']) + ) -const headersSorted = new Headers(headers) + const headersSorted = new Headers(headers) -const kHeadersList = Reflect.ownKeys(headers).find(c => String(c) === 'Symbol(headers list)') + const kHeadersList = Reflect.ownKeys(headers).find( + (c) => String(c) === 'Symbol(headers list)' + ) -const headersList = headers[kHeadersList] + const headersList = headers[kHeadersList] -const headersListSorted = headersSorted[kHeadersList] + const headersListSorted = headersSorted[kHeadersList] -const kHeadersSortedMap = Reflect.ownKeys(headersList).find( - (c) => String(c) === 'Symbol(headers map sorted)' -) + const kHeadersSortedMap = Reflect.ownKeys(headersList).find( + (c) => String(c) === 'Symbol(headers map sorted)' + ) -bench('Headers@@iterator', () => { - // prevention of memoization of results - headersList[kHeadersSortedMap] = null - return [...headers] -}) + group(`length ${length} #${name}`, () => { + bench('Headers@@iterator', () => { + // prevention of memoization of results + headersList[kHeadersSortedMap] = null + return [...headers] + }) -bench('Headers@@iterator (sorted)', () => { - // prevention of memoization of results - headersListSorted[kHeadersSortedMap] = null - return [...headersSorted] -}) + bench('Headers@@iterator (sorted)', () => { + // prevention of memoization of results + headersListSorted[kHeadersSortedMap] = null + return [...headersSorted] + }) + }) +} await run() diff --git a/lib/fetch/headers.js b/lib/fetch/headers.js index f904ca45e06..423cde0c4e9 100644 --- a/lib/fetch/headers.js +++ b/lib/fetch/headers.js @@ -290,6 +290,7 @@ class HeadersList { // binary search while (left < right) { pivot = left + ((right - left) >> 1) + // compare header name if (array[pivot][0] <= x[0]) { left = pivot + 1 } else { diff --git a/test/fetch/headerslist-sortedarray.js b/test/fetch/headerslist-sortedarray.js index eee9a546a14..d579e54bdd7 100644 --- a/test/fetch/headerslist-sortedarray.js +++ b/test/fetch/headerslist-sortedarray.js @@ -19,7 +19,7 @@ test('toSortedArray (fast-path)', () => { for (let i = 0; i < 1000; ++i) { const headersList = new HeadersList() for (let j = 0; j < 32; ++j) { - headersList.append(generateAsciiString(8), generateAsciiString(3)) + headersList.append(generateAsciiString(4), generateAsciiString(4)) } assert.deepStrictEqual(headersList.toSortedArray(), [...headersList].sort(compareHeaderName)) } @@ -30,7 +30,7 @@ test('toSortedArray (slow-path)', () => { for (let i = 0; i < 1000; ++i) { const headersList = new HeadersList() for (let j = 0; j < 64; ++j) { - headersList.append(generateAsciiString(8), generateAsciiString(3)) + headersList.append(generateAsciiString(4), generateAsciiString(4)) } assert.deepStrictEqual(headersList.toSortedArray(), [...headersList].sort(compareHeaderName)) }