Skip to content

Commit

Permalink
chore: update headers iterator benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
tsctx committed Feb 19, 2024
1 parent 2450393 commit c40ab11
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 23 deletions.
56 changes: 35 additions & 21 deletions benchmarks/headers.mjs
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -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()
1 change: 1 addition & 0 deletions lib/fetch/headers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions test/fetch/headerslist-sortedarray.js
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
Expand All @@ -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))
}
Expand Down

0 comments on commit c40ab11

Please sign in to comment.