Skip to content

Commit b24c75d

Browse files
committed
bespoke handling of object types to reduce work
1 parent e426cc4 commit b24c75d

File tree

3 files changed

+126
-117
lines changed

3 files changed

+126
-117
lines changed

results_latest.txt

+111-111
Original file line numberDiff line numberDiff line change
@@ -1,188 +1,188 @@
11
Benchmark cycles: 1,000 5,000 10,000 50,000 100,000 500,000 1,000,000 5,000,000
22

33
Boolean:
4-
1,000: 0.001 sec
5-
5,000: 0.001 sec
4+
1,000: 0 sec
5+
5,000: 0.002 sec
66
10,000: 0.001 sec
7-
50,000: 0.003 sec
7+
50,000: 0.002 sec
88
100,000: 0.002 sec
9-
500,000: 0.01 sec
10-
1,000,000: 0.021 sec
11-
5,000,000: 0.106 sec
12-
Average: 45,972,414 ops/sec
9+
500,000: 0.008 sec
10+
1,000,000: 0.016 sec
11+
5,000,000: 0.082 sec
12+
Average: 58,991,150 ops/sec
1313

1414
Infinity:
15-
1,000: 0.001 sec
15+
1,000: 0 sec
1616
5,000: 0.001 sec
1717
10,000: 0.001 sec
1818
50,000: 0.003 sec
19-
100,000: 0.004 sec
20-
500,000: 0.02 sec
21-
1,000,000: 0.039 sec
22-
5,000,000: 0.196 sec
23-
Average: 25,154,717 ops/sec
19+
100,000: 0.003 sec
20+
500,000: 0.016 sec
21+
1,000,000: 0.03 sec
22+
5,000,000: 0.151 sec
23+
Average: 32,517,073 ops/sec
2424

2525
NaN:
2626
1,000: 0 sec
2727
5,000: 0 sec
28-
10,000: 0 sec
28+
10,000: 0.001 sec
2929
50,000: 0.001 sec
30-
100,000: 0.003 sec
31-
500,000: 0.013 sec
32-
1,000,000: 0.027 sec
33-
5,000,000: 0.135 sec
34-
Average: 37,240,223 ops/sec
30+
100,000: 0.002 sec
31+
500,000: 0.01 sec
32+
1,000,000: 0.021 sec
33+
5,000,000: 0.104 sec
34+
Average: 47,956,835 ops/sec
3535

3636
null:
37-
1,000: 0 sec
37+
1,000: 0.001 sec
3838
5,000: 0 sec
39-
10,000: 0 sec
40-
50,000: 0.002 sec
39+
10,000: 0.001 sec
40+
50,000: 0.003 sec
4141
100,000: 0.002 sec
42-
500,000: 0.014 sec
43-
1,000,000: 0.028 sec
44-
5,000,000: 0.139 sec
45-
Average: 36,032,432 ops/sec
42+
500,000: 0.01 sec
43+
1,000,000: 0.021 sec
44+
5,000,000: 0.103 sec
45+
Average: 47,276,596 ops/sec
4646

4747
Number:
4848
1,000: 0 sec
4949
5,000: 0 sec
5050
10,000: 0 sec
51-
50,000: 0.002 sec
51+
50,000: 0.001 sec
5252
100,000: 0.002 sec
53-
500,000: 0.013 sec
54-
1,000,000: 0.026 sec
55-
5,000,000: 0.129 sec
56-
Average: 38,755,814 ops/sec
53+
500,000: 0.01 sec
54+
1,000,000: 0.02 sec
55+
5,000,000: 0.1 sec
56+
Average: 50,120,301 ops/sec
5757

5858
String:
5959
1,000: 0 sec
60-
5,000: 0 sec
60+
5,000: 0.001 sec
6161
10,000: 0.001 sec
62-
50,000: 0.001 sec
63-
100,000: 0.002 sec
62+
50,000: 0.002 sec
63+
100,000: 0.003 sec
6464
500,000: 0.01 sec
65-
1,000,000: 0.021 sec
66-
5,000,000: 0.104 sec
67-
Average: 47,956,835 ops/sec
65+
1,000,000: 0.02 sec
66+
5,000,000: 0.103 sec
67+
Average: 47,614,286 ops/sec
6868

6969
undefined:
7070
1,000: 0 sec
7171
5,000: 0 sec
72-
10,000: 0 sec
73-
50,000: 0.002 sec
72+
10,000: 0.001 sec
73+
50,000: 0.001 sec
7474
100,000: 0.004 sec
75-
500,000: 0.018 sec
76-
1,000,000: 0.037 sec
77-
5,000,000: 0.18 sec
78-
Average: 27,659,751 ops/sec
75+
500,000: 0.016 sec
76+
1,000,000: 0.033 sec
77+
5,000,000: 0.163 sec
78+
Average: 30,577,982 ops/sec
7979

8080
Function:
81-
1,000: 0.001 sec
81+
1,000: 0 sec
8282
5,000: 0.001 sec
8383
10,000: 0.002 sec
84-
50,000: 0.008 sec
85-
100,000: 0.016 sec
86-
500,000: 0.081 sec
87-
1,000,000: 0.158 sec
88-
5,000,000: 0.805 sec
89-
Average: 6,218,284 ops/sec
84+
50,000: 0.007 sec
85+
100,000: 0.015 sec
86+
500,000: 0.073 sec
87+
1,000,000: 0.146 sec
88+
5,000,000: 0.728 sec
89+
Average: 6,858,025 ops/sec
9090

9191
RegExp:
9292
1,000: 0.001 sec
93-
5,000: 0.003 sec
93+
5,000: 0.002 sec
9494
10,000: 0.006 sec
9595
50,000: 0.015 sec
9696
100,000: 0.03 sec
97-
500,000: 0.149 sec
98-
1,000,000: 0.297 sec
99-
5,000,000: 1.488 sec
100-
Average: 3,351,433 ops/sec
97+
500,000: 0.146 sec
98+
1,000,000: 0.294 sec
99+
5,000,000: 1.468 sec
100+
Average: 3,397,554 ops/sec
101101

102102
Array:
103-
1,000: 0.002 sec
104-
5,000: 0.006 sec
105-
10,000: 0.009 sec
106-
50,000: 0.035 sec
107-
100,000: 0.068 sec
108-
500,000: 0.34 sec
109-
1,000,000: 0.673 sec
103+
1,000: 0.003 sec
104+
5,000: 0.005 sec
105+
10,000: 0.012 sec
106+
50,000: 0.036 sec
107+
100,000: 0.074 sec
108+
500,000: 0.367 sec
109+
1,000,000: 0.699 sec
110110
5,000,000: 3.331 sec
111-
Average: 1,493,280 ops/sec
111+
Average: 1,472,498 ops/sec
112112

113113
Date:
114114
1,000: 0 sec
115-
5,000: 0.002 sec
116-
10,000: 0.002 sec
115+
5,000: 0.001 sec
116+
10,000: 0.003 sec
117117
50,000: 0.01 sec
118-
100,000: 0.015 sec
119-
500,000: 0.074 sec
120-
1,000,000: 0.147 sec
121-
5,000,000: 0.735 sec
122-
Average: 6,767,513 ops/sec
118+
100,000: 0.014 sec
119+
500,000: 0.072 sec
120+
1,000,000: 0.144 sec
121+
5,000,000: 0.718 sec
122+
Average: 6,929,314 ops/sec
123123

124124
Error:
125125
1,000: 0.001 sec
126126
5,000: 0.005 sec
127127
10,000: 0.013 sec
128-
50,000: 0.052 sec
129-
100,000: 0.102 sec
130-
500,000: 0.498 sec
131-
1,000,000: 1.017 sec
132-
5,000,000: 4.996 sec
133-
Average: 997,307 ops/sec
128+
50,000: 0.049 sec
129+
100,000: 0.097 sec
130+
500,000: 0.483 sec
131+
1,000,000: 0.966 sec
132+
5,000,000: 4.899 sec
133+
Average: 1,023,491 ops/sec
134134

135135
Event:
136136
1,000: 0.002 sec
137-
5,000: 0.005 sec
138-
10,000: 0.009 sec
139-
50,000: 0.029 sec
137+
5,000: 0.006 sec
138+
10,000: 0.008 sec
139+
50,000: 0.03 sec
140140
100,000: 0.059 sec
141-
500,000: 0.293 sec
142-
1,000,000: 0.586 sec
143-
5,000,000: 2.935 sec
144-
Average: 1,701,378 ops/sec
141+
500,000: 0.291 sec
142+
1,000,000: 0.582 sec
143+
5,000,000: 2.913 sec
144+
Average: 1,713,184 ops/sec
145145

146146
Map:
147-
1,000: 0.002 sec
148-
5,000: 0.007 sec
149-
10,000: 0.007 sec
150-
50,000: 0.031 sec
151-
100,000: 0.061 sec
152-
500,000: 0.308 sec
153-
1,000,000: 0.613 sec
154-
5,000,000: 3.083 sec
155-
Average: 1,621,109 ops/sec
147+
1,000: 0.001 sec
148+
5,000: 0.006 sec
149+
10,000: 0.006 sec
150+
50,000: 0.03 sec
151+
100,000: 0.06 sec
152+
500,000: 0.298 sec
153+
1,000,000: 0.596 sec
154+
5,000,000: 2.983 sec
155+
Average: 1,674,874 ops/sec
156156

157157
Object:
158158
1,000: 0.003 sec
159159
5,000: 0.007 sec
160160
10,000: 0.011 sec
161-
50,000: 0.056 sec
162-
100,000: 0.11 sec
163-
500,000: 0.549 sec
164-
1,000,000: 1.095 sec
165-
5,000,000: 5.478 sec
166-
Average: 912,026 ops/sec
161+
50,000: 0.055 sec
162+
100,000: 0.105 sec
163+
500,000: 0.525 sec
164+
1,000,000: 1.051 sec
165+
5,000,000: 5.246 sec
166+
Average: 951,878 ops/sec
167167

168168
Object (circular):
169-
1,000: 0.001 sec
169+
1,000: 0.002 sec
170170
5,000: 0.007 sec
171-
10,000: 0.011 sec
172-
50,000: 0.053 sec
171+
10,000: 0.01 sec
172+
50,000: 0.052 sec
173173
100,000: 0.1 sec
174-
500,000: 0.504 sec
175-
1,000,000: 1.009 sec
176-
5,000,000: 5.032 sec
177-
Average: 992,407 ops/sec
174+
500,000: 0.497 sec
175+
1,000,000: 0.994 sec
176+
5,000,000: 4.984 sec
177+
Average: 1,003,009 ops/sec
178178

179179
Set:
180180
1,000: 0.001 sec
181181
5,000: 0.006 sec
182-
10,000: 0.006 sec
183-
50,000: 0.028 sec
182+
10,000: 0.007 sec
183+
50,000: 0.027 sec
184184
100,000: 0.056 sec
185-
500,000: 0.279 sec
186-
1,000,000: 0.559 sec
187-
5,000,000: 2.798 sec
188-
Average: 1,785,695 ops/sec
185+
500,000: 0.275 sec
186+
1,000,000: 0.549 sec
187+
5,000,000: 2.749 sec
188+
Average: 1,816,349 ops/sec

src/constants.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ export type RecursiveClass = keyof typeof RECURSIVE_CLASSES;
105105
export const HASHABLE_TYPES = {
106106
bigint: 'i',
107107
boolean: 'b',
108+
empty: 'e',
108109
function: 'g',
109110
number: 'n',
110111
object: 'o',
111112
string: 's',
112113
symbol: 's',
113-
undefined: 'u',
114114
} as const;
115115

116116
export type HashableType = keyof typeof HASHABLE_TYPES;

src/stringify.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,25 @@ export function stringify(
246246
): string {
247247
const type = typeof value;
248248

249-
if (type === 'object' && value) {
249+
if (value == null || type === 'undefined') {
250+
return HASHABLE_TYPES.empty + value;
251+
}
252+
253+
if (type === 'object') {
250254
return stringifyComplexType(
251255
value,
252256
toString.call(value) as unknown as Class,
253257
state || { cache: new WeakMap(), id: 1 },
254258
);
255259
}
256260

257-
return (
258-
HASHABLE_TYPES[type] +
259-
(type === 'function' || type === 'symbol' ? value.toString() : value)
260-
);
261+
if (type === 'function' || type === 'symbol') {
262+
return HASHABLE_TYPES[type] + value.toString();
263+
}
264+
265+
if (type === 'boolean') {
266+
return HASHABLE_TYPES.boolean + +value;
267+
}
268+
269+
return HASHABLE_TYPES[type] + value;
261270
}

0 commit comments

Comments
 (0)