Skip to content

Commit ec1e958

Browse files
tsctxcrysmags
authored andcommitted
perf: reduce tst built time (nodejs#2517)
1 parent 3c0bd7f commit ec1e958

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

lib/core/tree.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
'use strict'
22

3-
const { wellknownHeaderNames } = require('./constants')
3+
const {
4+
wellknownHeaderNames,
5+
headerNameLowerCasedRecord
6+
} = require('./constants')
47

58
class TstNode {
69
/** @type {any} */
@@ -16,14 +19,15 @@ class TstNode {
1619
/**
1720
* @param {Uint8Array} key
1821
* @param {any} value
22+
* @param {number} index
1923
*/
20-
constructor (key, value) {
21-
if (key.length === 0) {
24+
constructor (key, value, index) {
25+
if (index === undefined || index >= key.length) {
2226
throw new TypeError('Unreachable')
2327
}
24-
this.code = key[0]
25-
if (key.length > 1) {
26-
this.middle = new TstNode(key.subarray(1), value)
28+
this.code = key[index]
29+
if (key.length !== ++index) {
30+
this.middle = new TstNode(key, value, index)
2731
} else {
2832
this.value = value
2933
}
@@ -32,31 +36,32 @@ class TstNode {
3236
/**
3337
* @param {Uint8Array} key
3438
* @param {any} value
39+
* @param {number} index
3540
*/
36-
add (key, value) {
37-
if (key.length === 0) {
41+
add (key, value, index) {
42+
if (index === undefined || index >= key.length) {
3843
throw new TypeError('Unreachable')
3944
}
40-
const code = key[0]
45+
const code = key[index]
4146
if (this.code === code) {
42-
if (key.length === 1) {
47+
if (key.length === ++index) {
4348
this.value = value
4449
} else if (this.middle !== null) {
45-
this.middle.add(key.subarray(1), value)
50+
this.middle.add(key, value, index)
4651
} else {
47-
this.middle = new TstNode(key.subarray(1), value)
52+
this.middle = new TstNode(key, value, index)
4853
}
4954
} else if (this.code < code) {
5055
if (this.left !== null) {
51-
this.left.add(key, value)
56+
this.left.add(key, value, index)
5257
} else {
53-
this.left = new TstNode(key, value)
58+
this.left = new TstNode(key, value, index)
5459
}
5560
} else {
5661
if (this.right !== null) {
57-
this.right.add(key, value)
62+
this.right.add(key, value, index)
5863
} else {
59-
this.right = new TstNode(key, value)
64+
this.right = new TstNode(key, value, index)
6065
}
6166
}
6267
}
@@ -102,9 +107,9 @@ class TernarySearchTree {
102107
* */
103108
insert (key, value) {
104109
if (this.node === null) {
105-
this.node = new TstNode(key, value)
110+
this.node = new TstNode(key, value, 0)
106111
} else {
107-
this.node.add(key, value)
112+
this.node.add(key, value, 0)
108113
}
109114
}
110115

@@ -119,7 +124,7 @@ class TernarySearchTree {
119124
const tree = new TernarySearchTree()
120125

121126
for (let i = 0; i < wellknownHeaderNames.length; ++i) {
122-
const key = wellknownHeaderNames[i].toLowerCase()
127+
const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]
123128
tree.insert(Buffer.from(key), key)
124129
}
125130

0 commit comments

Comments
 (0)