@@ -38,17 +38,21 @@ bun install jsoncmp
3838``` ts
3939import jsoncmp from ' jsoncmp' ;
4040
41- type JSONCmpValue =
41+ export type JSONCmpValue =
4242 | number
4343 | string
4444 | boolean
4545 | null
46- | JSONCmpValue []
47- | {
48- [key : string ]:
49- | JSONCmpValue
50- | undefined // allowed only for TS structural compatibility in unions
51- };
46+ | JSONCmpArray
47+ | JSONCmpObject ;
48+
49+ export type JSONCmpArray = JSONCmpValue [];
50+
51+ export interface JSONCmpObject {
52+ [key : string ]:
53+ | JSONCmpValue
54+ | undefined
55+ }
5256
5357/**
5458 * Compares two JSON-compatible values for deep structural equality.
@@ -83,68 +87,69 @@ console.log(jsoncmp(target, source)); //true
8387
8488| Library | Time | Relative Speed |
8589| :-- - | :-- - | :-- - |
86- | jsoncmp | 348.80 µs | 1.00x (baseline ) |
87- | fast - equals | 1.39 ms | 3.99x slower |
88- | dequal / lite | 1.54 ms | 4.42x slower |
89- | node .isDeepStrictEqual | 2.52 ms | 7.23x slower |
90- | JSON .stringify | 4.08 ms | 11.71x slower |
91- | lodash .isEqual | 6.47 ms | 18.54x slower |
90+ | jsoncmp | 341.63 µs | 1.00x (baseline ) |
91+ | fast - equals | 1.38 ms | 4.05x slower |
92+ | dequal / lite | 1.45 ms | 4.24x slower |
93+ | node .isDeepStrictEqual | 2.48 ms | 7.25x slower |
94+ | JSON .stringify | 3.84 ms | 11.24x slower |
95+ | lodash .isEqual | 6.24 ms | 18.27x slower |
96+
9297
9398<details >
9499<summary >Full benchmark result with hardware counters < / summary >
95100
96101` ` ` console
97- clk: ~3.69 GHz
102+ clk: ~3.67 GHz
98103cpu: AMD Ryzen 5 3600 6-Core Processor
99104runtime: node 24.4.1 (x64-linux)
100105
101106benchmark avg (min … max) p75 / p99 (min … top 1%)
102107------------------------------------------- -------------------------------
103108• Big JSON Object (~1.2 MiB, deeply nested)
104109------------------------------------------- -------------------------------
105- jsoncmp 348.80 µs/iter 344.88 µs █
106- (332.46 µs … 558 .35 µs) 534.88 µs █
107- (403.01 kb … 1.20 mb) 967.86 kb ▄█▃▁ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
108- 3.11 ipc ( 87.45 % cache) 3.20k branch misses
109- 1.42M cycles 4.43M instructions 93.73k c-refs 11.76k c-misses
110-
111- fast-equals 1.39 ms/iter 1.38 ms █
112- (1.32 ms … 1.88 ms) 1.66 ms ▂ █
113- (851.30 kb … 1.13 mb) 968.70 kb ▂█▆█▇▃ ▂▂▂▂▁▂▂▁▁▂▁▁▁▁ ▁
114- 2.70 ipc ( 87.48 % cache) 13.06k branch misses
115- 5.32M cycles 14.35M instructions 130.36k c-refs 16.31k c-misses
116-
117- dequal/lite 1.54 ms/iter 1.52 ms █
118- (1.51 ms … 2.18 ms) 2.02 ms ██
119- (484.92 kb … 690.30 kb) 485.44 kb ██▂▁▁▁▁▁▁▂ ▁▁▁▁▁▁ ▁▁▁▁▁
120- 2.48 ipc ( 91.62 % cache) 11.82k branch misses
121- 5.91M cycles 14.64M instructions 134.45k c-refs 11.27k c-misses
122-
123- lodash.isEqual 6.47 ms/iter 6.46 ms █
124- (6.30 ms … 8.03 ms) 7.42 ms █
125- ( 2.98 mb … 5.56 mb) 4.24 mb ▅██▂▁▆▄▁▂ ▁▁▁▁▁▁▁▁▁▁▁▁
126- 2.48 ipc ( 97.75 % cache) 34.76k branch misses
127- 24.94M cycles 61.94M instructions 1.50M c-refs 33.67k c-misses
128-
129- JSON.stringify 4.08 ms/iter 4.05 ms █
130- (3.90 ms … 9.64 ms) 4.99 ms █
131- ( 1.39 mb … 1.40 mb) 1.39 mb ▂▇██▄ ▂▁▂▁▁▁▁ ▁▁▁▁▁▁▁▁▁
132- 2.62 ipc ( 90.97 % cache) 50.92k branch misses
133- 13.17M cycles 34.50M instructions 428.33k c-refs 38.70k c-misses
134-
135- node.isDeepStrictEqual 2.52 ms/iter 2.51 ms █
136- (2.45 ms … 3.40 ms) 3.08 ms █▂
137- (941.22 kb … 1.96 mb) 1.36 mb ███▄▄▂▂▂▂ ▁▁▁▁▁▁▁▁▁▁▁▁
138- 2.69 ipc ( 92.85 % cache) 16.52k branch misses
139- 9.69M cycles 26.04M instructions 189.83k c-refs 13.58k c-misses
110+ jsoncmp 341.63 µs/iter 339.20 µs █
111+ (327.78 µs … 604 .35 µs) 534.00 µs █
112+ (382.48 kb … 1.23 mb) 967.89 kb ██▃▂ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
113+ 3.12 ipc ( 87.01 % cache) 3.20k branch misses
114+ 1.39M cycles 4.34M instructions 91.63k c-refs 11.90k c-misses
115+
116+ fast-equals 1.38 ms/iter 1.44 ms █
117+ (1.26 ms … 1.83 ms) 1.74 ms ██▆ ▂▃
118+ (763.16 kb … 1.11 mb) 968.27 kb ███▅██▂▃▄▄▃ ▂▂▂▅▇▃▂▂▂ ▁
119+ 2.69 ipc ( 87.40 % cache) 13.65k branch misses
120+ 5.33M cycles 14.30M instructions 130.47k c-refs 16.44k c-misses
121+
122+ dequal/lite 1.45 ms/iter 1.46 ms █
123+ (1.41 ms … 1.80 ms) 1.68 ms █▂
124+ (204.09 kb … 486.02 kb) 484.41 kb ████▇▄▂▃▂▂▂ ▁▁▁▁▂ ▁▁▁▁▁
125+ 2.62 ipc ( 88.67 % cache) 12.31k branch misses
126+ 5.58M cycles 14.60M instructions 108.22k c-refs 12.26k c-misses
127+
128+ lodash.isEqual 6.24 ms/iter 6.38 ms ▅ ▄█
129+ (5.90 ms … 7.82 ms) 6.95 ms █▇▇ ██▃
130+ ( 3.08 mb … 5.50 mb) 4.23 mb ▅███▇▅▄▇███▆▄▂▄ ▁▁▁▁▁▂
131+ 2.49 ipc ( 97.72 % cache) 33.35k branch misses
132+ 24.77M cycles 61.79M instructions 1.48M c-refs 33.85k c-misses
133+
134+ JSON.stringify 3.84 ms/iter 3.83 ms ██
135+ (3.56 ms … 8.55 ms) 5.48 ms ██
136+ ( 1.39 mb … 1.40 mb) 1.39 mb ██▇█▄▃▄▄ ▂▁▂▃ ▁▁▁▁▁▁▁▁▁
137+ 2.68 ipc ( 89.46 % cache) 51.52k branch misses
138+ 12.81M cycles 34.38M instructions 422.39k c-refs 44.54k c-misses
139+
140+ node.isDeepStrictEqual 2.48 ms/iter 2.47 ms █▃
141+ (2.42 ms … 3.47 ms) 2.96 ms ██
142+ (376.59 kb … 1.80 mb) 1.36 mb ███▄▁▁▁▁▁▂▂ ▁▁▁▁▁▂ ▁▁▁▁
143+ 2.73 ipc ( 92.25 % cache) 16.40k branch misses
144+ 9.55M cycles 26.06M instructions 187.67k c-refs 14.55k c-misses
140145
141146summary
142147 jsoncmp
143- 3.99x faster than fast-equals
144- 4.42x faster than dequal/lite
145- 7.23x faster than node.isDeepStrictEqual
146- 11.71x faster than JSON.stringify
147- 18.54x faster than lodash.isEqual
148+ 4.05x faster than fast-equals
149+ 4.24x faster than dequal/lite
150+ 7.25x faster than node.isDeepStrictEqual
151+ 11.24x faster than JSON.stringify
152+ 18.27x faster than lodash.isEqual
148153` ` `
149154
150155< / details >
0 commit comments