A fast, flexible and robust utility for deep equality comparison with type-specific logic and engine-aware design.
-
High Performance
Outperforms popular libraries likelodash.isEqual
,fast-equals
,dequal
,are-deeply-equal
andnode.isDeepStrictEqual
. -
Engine-Aware Design
Tailored execution paths for V8 and JSC based engines to maximize performance. -
Web-First Architecture
Uses a lightweight, browser-safe implementation by default with full compatibility across all modern browsers and runtimes. -
Broad Support
Handles objects, arrays, sets, maps, array buffers, typed arrays, data views, booleans, strings, numbers, bigints, dates, errors, regular expressions and primitives. -
Customizable
Fine-tune behavior with options for handling circular references, cross-realm objects, react elements and more. -
Fully Tested
Includes over 40 unit tests with complete parity againstlodash.isEqual
and edge case coverage. -
Type-Safe
Fully typed with TypeScript declarations.
npm install @observ33r/object-equals
Compares two values for deep equality.
- target: The first value to compare (
any
). - source: The second value to compare (
any
). - options: Optional configuration object (see below).
- Returns:
boolean
-true
if values are deeply equal,false
otherwise. - Throws:
TypeError
if an unsupported object type is encountered.
Property | Type | Default | Description |
---|---|---|---|
circular | boolean |
false |
Enables circular reference handling using a cache |
crossrealm | boolean |
false |
Enables cross-realm object comparison (e.g., vm contexts) |
react | boolean |
false |
Enables React element comparison (checks $$typeof , type , key , ref and props ) |
symbols | boolean |
false |
Includes symbol-keyed properties in object comparison |
fallback | boolean |
false |
Enables fallback comparison using valueOf() or toString() |
cache | Map | WeakMap |
undefined |
Custom cache for circular references (auto-managed if circular is true ) |
or
The core comparison function, exposed for advanced use cases. Takes individual parameters instead of an options object.
import { objectEquals } from '@observ33r/object-equals';
const obj1 = { a: 1, b: [2, 3] };
const obj2 = { a: 1, b: [2, 3] };
console.log(objectEquals(obj1, obj2)); //true
import { objectEquals } from '@observ33r/object-equals';
class ExtendedMap extends Map {}
const map1 = new ExtendedMap([['key-1', 'value-1']]);
const map2 = new ExtendedMap([['key-1', 'value-1']]);
console.log(objectEquals(map1, map2)); //true
import { objectEquals } from '@observ33r/object-equals';
const obj1 = { a: 1 };
obj1.self = obj1;
const obj2 = { a: 1 };
obj2.self = obj2;
console.log(objectEquals(obj1, obj2, { circular: true })); //true
import vm from 'node:vm';
import { objectEquals } from '@observ33r/object-equals';
class ExtendedArray extends Array {}
const CrossRealmArray = vm.runInContext('Array', vm.createContext());
const array = [1, 2, 3];
const extArr = new ExtendedArray(1, 2, 3);
const realmArr = new CrossRealmArray(1, 2, 3);
//extended
console.log(objectEquals(array, extArr, { crossrealm: true })); //true
//vm context
console.log(objectEquals(array, realmArr, { crossrealm: true })); //true
import { createElement } from 'react';
import { objectEquals } from '@observ33r/object-equals';
const el1 = createElement('a', { onClick: () => { console.log('click'); } }, 'text');
const el2 = createElement('a', { onClick: () => { console.log('click'); } }, 'text');
console.log(objectEquals(el1, el2, { react: true })); //true
import { objectEquals } from '@observ33r/object-equals';
const obj1 = { a: 1, [Symbol('b')]: [2, 3] };
const obj2 = { a: 1, [Symbol('b')]: [2, 3] };
console.log(objectEquals(obj1, obj2, { symbols: true })); //true
import { objectEquals } from '@observ33r/object-equals';
const params1 = new URLSearchParams('foo=1&bar=2');
const params2 = new URLSearchParams('foo=1&bar=2');
console.log(objectEquals(params1, params2, { fallback: true })); //true
Library | Time | Relative Speed |
---|---|---|
object-equals | 483.52 µs | 1.00x (baseline) |
fast-equals | 1.37 ms | 2.83x slower |
dequal | 1.44 ms | 2.98x slower |
node.isDeepStrictEqual | 2.43 ms | 5.02x slower |
are-deeply-equal | 2.76 ms | 5.70x slower |
lodash.isEqual | 5.23 ms | 10.81x slower |
Full benchmark result with hardware counters
clk: ~3.70 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Big JSON Object (~1.2 MiB, deeply nested)
------------------------------------------- -------------------------------
object-equals 483.52 µs/iter 484.03 µs █
(466.96 µs … 704.74 µs) 664.33 µs █▅
(340.07 kb … 1.44 mb) 968.34 kb ▃██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.12 ipc ( 87.00% cache) 4.94k branch misses
1.98M cycles 6.17M instructions 114.31k c-refs 14.86k c-misses
are-deeply-equal 2.76 ms/iter 2.79 ms █
(2.58 ms … 3.84 ms) 3.60 ms █ ▄
(920.88 kb … 2.17 mb) 1.78 mb ▄█▃██▃▂▃▄▃▂▁▁▂▁▁▁▁▁▁▁
2.51 ipc ( 88.60% cache) 26.89k branch misses
10.31M cycles 25.86M instructions 357.36k c-refs 40.75k c-misses
fast-equals 1.37 ms/iter 1.37 ms █▃
(1.33 ms … 1.71 ms) 1.60 ms ██
(806.30 kb … 1.15 mb) 968.52 kb ▅███▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.73 ipc ( 87.44% cache) 12.87k branch misses
5.26M cycles 14.35M instructions 124.59k c-refs 15.65k c-misses
dequal 1.44 ms/iter 1.49 ms ▂█
(1.38 ms … 1.66 ms) 1.55 ms ██▃ ▂▂
(484.92 kb … 776.80 kb) 485.59 kb ▃████▄▅▂▃▄▃▄███▅▃▂▂▂▁
2.56 ipc ( 90.46% cache) 11.93k branch misses
5.77M cycles 14.77M instructions 121.39k c-refs 11.59k c-misses
lodash.isEqual 5.23 ms/iter 5.23 ms █▄
(5.14 ms … 5.98 ms) 5.65 ms ███▃
( 2.31 mb … 4.32 mb) 2.97 mb ▅████▂▄▃▂▂▂▂▁▂▂▁▁▁▁▁▂
2.57 ipc ( 96.64% cache) 37.07k branch misses
21.43M cycles 55.03M instructions 822.59k c-refs 27.62k c-misses
node.isDeepStrictEqual 2.43 ms/iter 2.43 ms █
(2.38 ms … 2.95 ms) 2.74 ms ▇█▄
(280.57 kb … 2.07 mb) 1.36 mb ▆███▄▂▁▁▁▁▁▁▁▂▂▁▁▁▁▁▁
2.62 ipc ( 92.07% cache) 16.58k branch misses
9.92M cycles 26.02M instructions 189.42k c-refs 15.03k c-misses
summary
object-equals
2.83x faster than fast-equals
2.98x faster than dequal
5.02x faster than node.isDeepStrictEqual
5.7x faster than are-deeply-equal
10.81x faster than lodash.isEqual
Note
The object is a deeply nested structure (depth: 17) containing objects, arrays, strings, booleans, numbers and nulls. It has a file size of 1.2 MiB, with a root size of 18 and nested sizes ranging from 0 to 21.
Important
Times for object sizes: 16, 512, 4096, 16386
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 996.75 ns | 30.33 µs | 267.94 µs | 1.07 ms | 1.00x (baseline) |
react-fast-compare | 6.87 µs | 210.55 µs | 1.63 ms | 6.66 ms | 6.89x-6.22x slower |
fast-equals | 7.02 µs | 208.94 µs | 1.58 ms | 6.83 ms | 7.05x-6.38x slower |
dequal | 7.96 µs | 240.44 µs | 1.96 ms | 7.70 ms | 7.99x-7.19x slower |
are-deeply-equal | 16.93 µs | 510.79 µs | 4.27 ms | 19.10 ms | 16.99x-17.84x slower |
node.isDeepStrictEqual | 17.01 µs | 473.63 µs | 4.01 ms | 15.77 ms | 17.06x-14.73x slower |
lodash.isEqual | 34.82 µs | 1.03 ms | 8.01 ms | 31.12 ms | 34.93x-29.07x slower |
Full benchmark results with hardware counters
clk: ~3.79 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• React elements [size=16]
------------------------------------------- -------------------------------
object-equals 996.75 ns/iter 1.02 µs █
(928.56 ns … 1.20 µs) 1.19 µs ▃▂█▃
( 1.87 kb … 2.44 kb) 2.13 kb ██████▆▅▂▄▃▃▃▃▂▂▃▄▂▂▂
3.87 ipc ( 96.36% cache) 1.10 branch misses
3.91k cycles 15.13k instructions 91.50 c-refs 3.33 c-misses
react-fast-compare 6.87 µs/iter 6.91 µs █ █
(6.77 µs … 7.02 µs) 6.96 µs █ █ █ █
( 6.37 kb … 6.38 kb) 6.38 kb █▁▁████▁█▁███▁██▁▁███
3.09 ipc ( 96.77% cache) 2.53 branch misses
26.41k cycles 81.69k instructions 398.22 c-refs 12.86 c-misses
are-deeply-equal 16.93 µs/iter 17.20 µs █
(16.58 µs … 17.23 µs) 17.22 µs █ █
( 13.20 kb … 13.20 kb) 13.20 kb █▁█▁▁██▁██▁▁█▁▁▁▁▁▁▁█
2.74 ipc ( 95.85% cache) 61.43 branch misses
64.91k cycles 178.00k instructions 836.31 c-refs 34.69 c-misses
fast-equals 7.02 µs/iter 7.13 µs ▂ █
(6.75 µs … 7.24 µs) 7.21 µs █ █ ▅ ▅ ▅
( 6.37 kb … 6.38 kb) 6.38 kb ▇▁▁▁▁█▁▇▁▇▇█▇█▁▁█▇▇▁█
2.98 ipc ( 95.84% cache) 2.72 branch misses
26.95k cycles 80.19k instructions 336.77 c-refs 14.01 c-misses
dequal 7.96 µs/iter 7.98 µs ██ █
(7.90 µs … 8.16 µs) 8.04 µs ▅██▅▅ █▅▅ ▅▅ ▅ ▅ ▅▅
( 3.17 kb … 3.20 kb) 3.19 kb █████▁███▁██▁█▁█▁▁▁██
2.82 ipc ( 96.04% cache) 2.45 branch misses
30.68k cycles 86.39k instructions 207.30 c-refs 8.22 c-misses
lodash.isEqual 34.82 µs/iter 34.22 µs █
(33.14 µs … 301.34 µs) 47.00 µs █
(520.00 b … 903.28 kb) 23.84 kb ▁█▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.56 ipc ( 99.03% cache) 42.48 branch misses
135.39k cycles 346.90k instructions 6.80k c-refs 65.59 c-misses
node.isDeepStrictEqual 17.01 µs/iter 16.68 µs █
(16.33 µs … 224.45 µs) 23.24 µs ▇█
( 2.02 kb … 267.35 kb) 10.23 kb ██▃▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.68 ipc ( 98.52% cache) 51.84 branch misses
66.51k cycles 178.50k instructions 1.38k c-refs 20.41 c-misses
summary
object-equals
6.89x faster than react-fast-compare
7.05x faster than fast-equals
7.99x faster than dequal
16.99x faster than are-deeply-equal
17.06x faster than node.isDeepStrictEqual
34.93x faster than lodash.isEqual
• React elements [size=512]
------------------------------------------- -------------------------------
object-equals 30.33 µs/iter 30.67 µs █
(29.65 µs … 31.49 µs) 31.41 µs █ █
(144.19 b … 149.53 b) 144.64 b ██▁██▁▁▁▁▁█▁█▁▁▁█▁▁▁█
3.73 ipc ( 90.22% cache) 5.06 branch misses
121.14k cycles 452.06k instructions 9.09k c-refs 888.87 c-misses
react-fast-compare 210.55 µs/iter 210.22 µs ▃█
(198.47 µs … 437.07 µs) 254.83 µs ██▃
( 78.10 kb … 562.63 kb) 193.32 kb ▁████▇▄▂▂▁▁▁▁▁▂▂▂▁▁▁▁
3.06 ipc ( 75.89% cache) 43.86 branch misses
803.58k cycles 2.46M instructions 18.31k c-refs 4.41k c-misses
are-deeply-equal 510.79 µs/iter 512.35 µs █
(485.49 µs … 743.90 µs) 637.30 µs ▆█▃
(297.80 kb … 590.24 kb) 409.69 kb ▁▃███▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.72 ipc ( 84.37% cache) 2.06k branch misses
1.97M cycles 5.35M instructions 37.94k c-refs 5.93k c-misses
fast-equals 208.94 µs/iter 209.11 µs █▆
(189.51 µs … 533.05 µs) 281.53 µs ▇██
( 49.34 kb … 416.51 kb) 193.08 kb ▂▄████▄▂▁▁▁▂▂▂▁▁▁▁▁▁▁
3.02 ipc ( 74.06% cache) 45.21 branch misses
799.09k cycles 2.41M instructions 15.51k c-refs 4.02k c-misses
dequal 240.44 µs/iter 240.90 µs █▆
(218.76 µs … 473.41 µs) 313.99 µs ██
( 76.81 kb … 313.82 kb) 96.95 kb ▃▅▆███▅▂▂▁▃▂▂▂▂▁▁▁▁▁▁
2.82 ipc ( 73.38% cache) 43.71 branch misses
924.49k cycles 2.60M instructions 12.90k c-refs 3.44k c-misses
lodash.isEqual 1.03 ms/iter 1.02 ms █
(972.24 µs … 2.94 ms) 1.31 ms █
(308.13 kb … 1.23 mb) 665.75 kb ▁██▇▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.60 ipc ( 95.26% cache) 170.73 branch misses
3.96M cycles 10.31M instructions 144.13k c-refs 6.83k c-misses
node.isDeepStrictEqual 473.63 µs/iter 474.91 µs █▃
(455.86 µs … 708.57 µs) 568.64 µs ▅██
(241.80 kb … 337.87 kb) 288.69 kb ▂████▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
2.74 ipc ( 75.65% cache) 687.57 branch misses
1.93M cycles 5.28M instructions 22.09k c-refs 5.38k c-misses
summary
object-equals
6.89x faster than fast-equals
6.94x faster than react-fast-compare
7.93x faster than dequal
15.62x faster than node.isDeepStrictEqual
16.84x faster than are-deeply-equal
33.93x faster than lodash.isEqual
• React elements [size=4096]
------------------------------------------- -------------------------------
object-equals 267.94 µs/iter 265.96 µs █
(248.63 µs … 518.86 µs) 443.63 µs ▅█
( 84.75 kb … 832.33 kb) 512.48 kb ██▇▃▃▃▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁
3.60 ipc ( 86.60% cache) 182.06 branch misses
1.01M cycles 3.64M instructions 99.87k c-refs 13.38k c-misses
react-fast-compare 1.63 ms/iter 1.65 ms ▃█▅
(1.52 ms … 1.97 ms) 1.88 ms ███▇
( 1.50 mb … 1.50 mb) 1.50 mb ▂▅▂█████▇▅▅▃▂▂▁▂▂▂▂▁▁
3.13 ipc ( 95.93% cache) 133.97 branch misses
6.28M cycles 19.68M instructions 147.83k c-refs 6.02k c-misses
are-deeply-equal 4.27 ms/iter 4.27 ms █
(4.12 ms … 5.97 ms) 5.94 ms ▇█▂
( 2.66 mb … 3.22 mb) 3.15 mb ███▄▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.69 ipc ( 91.36% cache) 15.95k branch misses
15.89M cycles 42.74M instructions 403.17k c-refs 34.85k c-misses
fast-equals 1.58 ms/iter 1.59 ms █▂
(1.51 ms … 1.80 ms) 1.77 ms ▅███▂
( 1.50 mb … 1.50 mb) 1.50 mb ▂▅█████▆▃▃▃▄▃▁▂▁▁▁▂▂▁
3.01 ipc ( 93.59% cache) 134.86 branch misses
6.42M cycles 19.30M instructions 134.11k c-refs 8.60k c-misses
dequal 1.96 ms/iter 1.96 ms █▇
(1.86 ms … 2.48 ms) 2.34 ms ██▃
(768.33 kb … 769.59 kb) 768.36 kb ▇███▆▃▂▄▃▃▃▃▂▁▁▂▂▂▁▁▁
2.82 ipc ( 91.61% cache) 120.87 branch misses
7.38M cycles 20.81M instructions 108.17k c-refs 9.08k c-misses
lodash.isEqual 8.01 ms/iter 8.08 ms █▂
(7.87 ms … 8.50 ms) 8.34 ms ▅██▇ ▄ ▄
( 4.39 mb … 5.96 mb) 5.15 mb ▇██████▄▃▃▃▄█▃▃▆▃▄▁▃▃
2.65 ipc ( 98.46% cache) 918.98 branch misses
30.85M cycles 81.87M instructions 1.18M c-refs 18.19k c-misses
node.isDeepStrictEqual 4.01 ms/iter 4.02 ms ▂█▆
(3.92 ms … 4.31 ms) 4.26 ms ▆▃███▇
( 2.25 mb … 2.25 mb) 2.25 mb ▅███████▅▂▂▂▁▂▂▂▁▂▂▂▂
2.74 ipc ( 95.03% cache) 5.27k branch misses
15.40M cycles 42.14M instructions 181.32k c-refs 9.01k c-misses
summary
object-equals
5.89x faster than fast-equals
6.09x faster than react-fast-compare
7.3x faster than dequal
14.95x faster than node.isDeepStrictEqual
15.93x faster than are-deeply-equal
29.9x faster than lodash.isEqual
• React elements [size=16386]
------------------------------------------- -------------------------------
object-equals 1.07 ms/iter 1.08 ms █▇
(990.79 µs … 1.47 ms) 1.40 ms ██▆
( 1.89 mb … 2.11 mb) 2.00 mb ▄████▅▄▄▄▃▂▄▂▁▂▁▁▁▁▁▁
3.56 ipc ( 94.14% cache) 1.17k branch misses
4.10M cycles 14.59M instructions 432.17k c-refs 25.33k c-misses
react-fast-compare 6.66 ms/iter 6.71 ms █ ▆ █▃
(6.49 ms … 7.15 ms) 7.05 ms █▅█▅██▄▇ ▂
( 6.00 mb … 6.00 mb) 6.00 mb █████████▆█▅█▁▁▃█▁▁▁▃
3.08 ipc ( 95.26% cache) 398.43 branch misses
25.58M cycles 78.71M instructions 637.63k c-refs 30.24k c-misses
are-deeply-equal 19.10 ms/iter 19.02 ms █
(18.64 ms … 21.26 ms) 21.16 ms ██▃
( 12.50 mb … 12.58 mb) 12.53 mb ▇███▇▁▁▃▁▁▁▁▁▁▁▁▁▁▁▁▅
2.55 ipc ( 86.82% cache) 64.57k branch misses
67.04M cycles 171.26M instructions 1.77M c-refs 233.77k c-misses
fast-equals 6.83 ms/iter 6.96 ms ▅▃█▃██
(6.56 ms … 7.25 ms) 7.21 ms ▃██████▃ ▆▆▃▆ ▃▃
( 6.00 mb … 6.00 mb) 6.00 mb ▆█████████████████▄▄▆
2.95 ipc ( 94.28% cache) 469.05 branch misses
26.19M cycles 77.22M instructions 534.64k c-refs 30.56k c-misses
dequal 7.70 ms/iter 7.75 ms █▅▃
(7.50 ms … 8.26 ms) 8.20 ms ▅███▄▂
( 3.00 mb … 3.00 mb) 3.00 mb ▆██████▆▆▆▁▁▄▄▃▃▃▇▁▄▃
2.81 ipc ( 93.81% cache) 332.51 branch misses
29.62M cycles 83.26M instructions 437.01k c-refs 27.03k c-misses
lodash.isEqual 31.12 ms/iter 31.27 ms █ █ █ █ █
(30.74 ms … 31.55 ms) 31.45 ms ▅▅ ▅ █▅█▅ █ ▅█▅█ ▅
( 20.63 mb … 20.93 mb) 20.65 mb ██▁█▁████▁▁█▁▁████▁▁█
2.58 ipc ( 98.47% cache) 5.71k branch misses
127.70M cycles 329.50M instructions 5.62M c-refs 85.88k c-misses
node.isDeepStrictEqual 15.77 ms/iter 16.24 ms ▅█▂
(14.98 ms … 17.70 ms) 17.61 ms ███▅ ▂
( 9.00 mb … 9.00 mb) 9.00 mb ████▇▁▄▁▄▄▄▁▁▇▁▄▁█▁▄▇
2.73 ipc ( 95.00% cache) 19.27k branch misses
61.85M cycles 168.58M instructions 733.94k c-refs 36.68k c-misses
summary
object-equals
6.22x faster than react-fast-compare
6.38x faster than fast-equals
7.19x faster than dequal
14.73x faster than node.isDeepStrictEqual
17.84x faster than are-deeply-equal
29.07x faster than lodash.isEqual
Note
The react
option is designed to support React elements comparison, including props that contain inline functions (e.g. onClick: () => ...
). Most libraries fail such comparisons due to referential inequality. For benchmarking fairness, all comparisons use structurally equivalent trees without inline functions.
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 142.36 ns | 31.99 µs | 694.95 µs | 3.91 ms | 1.00x (baseline) |
fast-equals | 873.33 ns | 38.59 µs | 792.80 µs | 4.12 ms | 6.13x-1.06x slower |
are-deeply-equal | 899.22 ns | 37.54 µs | 780.04 µs | 4.39 ms | 6.32x-1.12x slower |
dequal | 929.12 ns | 63.33 µs | 946.56 µs | 4.77 ms | 6.53x-1.22x slower |
node.isDeepStrictEqual | 937.36 ns | 37.97 µs | 747.63 µs | 4.32 ms | 6.58x-1.11x slower |
lodash.isEqual | 1.29 µs | 43.88 µs | 842.46 µs | 4.48 ms | 9.08x-1.15x slower |
Full benchmark results with hardware counters
clk: ~3.91 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Object with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 142.36 ns/iter 142.02 ns █
(136.68 ns … 223.73 ns) 188.70 ns █▅
(197.47 b … 456.27 b) 352.22 b ▅██▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁
4.03 ipc ( 96.60% cache) 0.03 branch misses
578.44 cycles 2.33k instructions 11.72 c-refs 0.40 c-misses
are-deeply-equal 899.22 ns/iter 916.66 ns █
(847.15 ns … 1.10 µs) 1.06 µs █▄
(430.28 b … 761.70 b) 600.25 b ███▅▆▃▄▃▃▃▂▃▃▂▂▂▂▂▃▃▁
2.80 ipc ( 95.75% cache) 0.06 branch misses
3.54k cycles 9.90k instructions 25.78 c-refs 1.10 c-misses
fast-equals 873.33 ns/iter 892.94 ns ▆▅ ▆█▆▂
(807.30 ns … 1.12 µs) 1.03 µs ▂██ █████▄
( 16.11 b … 557.93 b) 352.14 b ██████████▃▄▄▄▆▃▃▁▁▃▃
2.83 ipc ( 94.86% cache) 0.05 branch misses
3.40k cycles 9.64k instructions 12.67 c-refs 0.65 c-misses
dequal 929.12 ns/iter 935.21 ns ▂█
(903.99 ns … 1.04 µs) 1.03 µs ██▅
(170.30 b … 404.96 b) 177.39 b ▅███▇▅▅▅▃▄▂▂▂▁▁▁▁▁▁▁▂
2.75 ipc ( 93.86% cache) 0.04 branch misses
3.57k cycles 9.82k instructions 6.64 c-refs 0.41 c-misses
lodash.isEqual 1.29 µs/iter 1.31 µs █
(1.22 µs … 1.50 µs) 1.39 µs ██
(687.52 b … 1.33 kb) 933.00 b ▆▇▄▃▂▄▂▅▆██▃▁▂▁▃▂▃▁▃▂
2.72 ipc ( 96.96% cache) 0.10 branch misses
5.07k cycles 13.78k instructions 85.48 c-refs 2.60 c-misses
node.isDeepStrictEqual 937.36 ns/iter 940.00 ns █
(850.00 ns … 194.47 µs) 1.33 µs █ ▆█
(792.00 b … 411.47 kb) 813.54 b ▂████▄▂▂▂▁▂▁▁▁▁▁▁▁▁▁▁
2.11 ipc ( 99.63% cache) 30.08 branch misses
5.07k cycles 10.69k instructions 449.28 c-refs 1.68 c-misses
summary
object-equals
6.13x faster than fast-equals
6.32x faster than are-deeply-equal
6.53x faster than dequal
6.58x faster than node.isDeepStrictEqual
9.08x faster than lodash.isEqual
• Object with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 31.99 µs/iter 32.04 µs █
(30.57 µs … 33.99 µs) 33.78 µs █ █ █
(259.87 b … 261.79 b) 260.07 b █▁██▁▁▁███▁▁▁▁▁▁▁▁▁▁█
3.60 ipc ( 98.97% cache) 186.76 branch misses
124.97k cycles 449.46k instructions 10.39k c-refs 106.56 c-misses
are-deeply-equal 37.54 µs/iter 38.29 µs █
(36.45 µs … 39.97 µs) 39.51 µs ▅ █
( 8.78 kb … 8.78 kb) 8.78 kb █▇█▁▇▁▁▁▁▁▁▁▇▁▁▁▇▁▁▁▇
3.48 ipc ( 98.95% cache) 183.79 branch misses
149.81k cycles 521.40k instructions 12.67k c-refs 133.02 c-misses
fast-equals 38.59 µs/iter 38.62 µs █
(38.20 µs … 39.12 µs) 39.09 µs █
(259.87 b … 260.79 b) 259.95 b ▇▇▇▇▁▁▁▇▁█▁▁▁▇▁▁▁▁▁▁▇
3.53 ipc ( 98.98% cache) 233.07 branch misses
156.17k cycles 551.76k instructions 10.13k c-refs 103.53 c-misses
dequal 63.33 µs/iter 63.42 µs █
(56.82 µs … 227.68 µs) 100.35 µs █
(416.00 b … 202.04 kb) 17.11 kb ▂█▅▅▂▂▁▃▃▂▁▁▁▁▁▁▁▁▁▁▁
2.92 ipc ( 97.68% cache) 628.84 branch misses
248.85k cycles 726.95k instructions 10.27k c-refs 238.13 c-misses
lodash.isEqual 43.88 µs/iter 43.65 µs █
(40.66 µs … 254.68 µs) 63.63 µs █▇
(840.00 b … 223.34 kb) 25.82 kb ▃███▂▂▂▂▂▁▁▂▁▁▁▁▁▁▁▁▁
3.36 ipc ( 97.79% cache) 383.74 branch misses
168.88k cycles 567.55k instructions 14.22k c-refs 314.29 c-misses
node.isDeepStrictEqual 37.97 µs/iter 38.11 µs █
(37.18 µs … 39.98 µs) 38.98 µs █ █
( 8.38 kb … 8.38 kb) 8.38 kb █▁▁████▁▁▁█▁█▁▁▁▁▁▁▁█
3.56 ipc ( 98.64% cache) 218.61 branch misses
145.86k cycles 519.58k instructions 11.91k c-refs 161.49 c-misses
summary
object-equals
1.17x faster than are-deeply-equal
1.19x faster than node.isDeepStrictEqual
1.21x faster than fast-equals
1.37x faster than lodash.isEqual
1.98x faster than dequal
• Object with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 694.95 µs/iter 697.87 µs █
(668.01 µs … 965.24 µs) 875.89 µs █
(128.17 kb … 472.88 kb) 146.34 kb ██▅▄▃▄▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁
1.53 ipc ( 93.01% cache) 53.78k branch misses
2.78M cycles 4.26M instructions 238.90k c-refs 16.70k c-misses
are-deeply-equal 780.04 µs/iter 771.63 µs █
(744.29 µs … 1.09 ms) 984.91 µs █
(192.45 kb … 225.16 kb) 219.22 kb ▅██▃▁▂▃▂▁▁▁▁▁▁▁▁▁▂▁▁▁
1.51 ipc ( 93.07% cache) 59.82k branch misses
3.12M cycles 4.69M instructions 270.51k c-refs 18.75k c-misses
fast-equals 792.80 µs/iter 786.30 µs █
(765.39 µs … 1.06 ms) 966.10 µs █▅
(128.17 kb … 161.13 kb) 146.09 kb ▃██▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.65 ipc ( 93.61% cache) 54.22k branch misses
3.02M cycles 4.98M instructions 228.87k c-refs 14.62k c-misses
dequal 946.56 µs/iter 966.24 µs ▄█▄
(893.81 µs … 1.09 ms) 1.01 ms ▄▆ ▂▅███
(128.14 kb … 161.02 kb) 146.09 kb ▃████▅▆▅▅██████▂▂▂▂▂▂
1.71 ipc ( 93.57% cache) 56.42k branch misses
3.72M cycles 6.36M instructions 253.60k c-refs 16.31k c-misses
lodash.isEqual 842.46 µs/iter 849.78 µs ▃ █
(792.04 µs … 1.47 ms) 1.08 ms █ █
(122.71 kb … 877.27 kb) 221.88 kb ▇████▃▂▂▁▁▂▂▁▁▁▁▂▁▁▁▁
1.60 ipc ( 93.82% cache) 61.95k branch misses
3.29M cycles 5.26M instructions 283.99k c-refs 17.55k c-misses
node.isDeepStrictEqual 747.63 µs/iter 747.81 µs █▃
(730.85 µs … 954.62 µs) 834.74 µs ▆██
( 31.64 kb … 419.14 kb) 219.24 kb ▄████▃▂▂▂▂▁▁▁▁▁▂▁▁▁▁▁
1.56 ipc ( 93.31% cache) 58.20k branch misses
3.04M cycles 4.75M instructions 259.66k c-refs 17.36k c-misses
summary
object-equals
1.08x faster than node.isDeepStrictEqual
1.12x faster than are-deeply-equal
1.14x faster than fast-equals
1.21x faster than lodash.isEqual
1.36x faster than dequal
• Object with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 3.91 ms/iter 3.92 ms █
(3.76 ms … 4.64 ms) 4.60 ms ▄█
(512.23 kb … 513.94 kb) 512.24 kb ███▅▅▃▂▂▃▁▂▂▁▃▁▂▁▁▁▂▁
1.35 ipc ( 77.60% cache) 259.96k branch misses
13.65M cycles 18.49M instructions 1.30M c-refs 290.68k c-misses
are-deeply-equal 4.39 ms/iter 4.40 ms █
(4.26 ms … 5.19 ms) 4.97 ms ▅█▇
(768.54 kb … 769.88 kb) 768.55 kb ▂████▇▂▂▁▃▂▁▂▂▁▁▁▁▁▁▁
1.36 ipc ( 77.82% cache) 290.04k branch misses
15.28M cycles 20.78M instructions 1.49M c-refs 331.41k c-misses
fast-equals 4.12 ms/iter 4.11 ms █
(3.99 ms … 5.11 ms) 5.00 ms █▂
(512.23 kb … 513.62 kb) 512.24 kb ▅██▄▄▂▁▂▁▁▁▁▂▁▁▂▁▁▁▁▁
1.51 ipc ( 77.98% cache) 254.54k branch misses
14.62M cycles 22.15M instructions 1.32M c-refs 289.71k c-misses
dequal 4.77 ms/iter 4.82 ms █▆▅
(4.45 ms … 5.60 ms) 5.35 ms ███▂
(466.64 kb … 560.23 kb) 512.23 kb ▄▂▄▂▃▇████▃▄▁▃▁▁▁▁▁▁▂
1.58 ipc ( 77.95% cache) 266.50k branch misses
17.32M cycles 27.39M instructions 1.36M c-refs 300.32k c-misses
lodash.isEqual 4.48 ms/iter 4.58 ms █
(4.20 ms … 5.44 ms) 5.30 ms ██ ▇▂
(634.64 kb … 1.94 mb) 779.98 kb ██▆▆▄██▆▄▂▃▃▄▄▂▂▂▂▃▁▂
1.41 ipc ( 77.74% cache) 292.93k branch misses
15.96M cycles 22.47M instructions 1.55M c-refs 345.63k c-misses
node.isDeepStrictEqual 4.32 ms/iter 4.33 ms █▂
(4.26 ms … 4.97 ms) 4.70 ms ██▃
(768.36 kb … 771.55 kb) 768.38 kb ▇███▅▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.34 ipc ( 76.76% cache) 289.44k branch misses
15.16M cycles 20.24M instructions 1.42M c-refs 329.65k c-misses
summary
object-equals
1.06x faster than fast-equals
1.11x faster than node.isDeepStrictEqual
1.12x faster than are-deeply-equal
1.15x faster than lodash.isEqual
1.22x faster than dequal
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 3.99 µs | 180.93 µs | 8.53 ms | 36.73 ms | 1.00x (baseline) |
fast-equals | 18.66 µs | 659.85 µs | 11.73 ms | 51.14 ms | 4.68x-1.39x slower |
dequal | 19.09 µs | 1.01 ms | 13.57 ms | 61.98 ms | 4.79x-1.69x slower |
node.isDeepStrictEqual | 19.45 µs | 608.04 µs | 11.21 ms | 51.27 ms | 4.88x-1.40x slower |
are-deeply-equal | 20.47 µs | 677.69 µs | 13.38 ms | 61.65 ms | 5.13x-1.68x slower |
lodash.isEqual | 29.15 µs | 1.04 ms | 16.18 ms | 71.95 ms | 7.31x-1.96x slower |
Full benchmark results with hardware counters
clk: ~3.82 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Nested Object with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 3.99 µs/iter 4.03 µs ▄ █
(3.91 µs … 4.12 µs) 4.10 µs █ ▅█▅ ▅▅ ▅
( 7.22 kb … 7.23 kb) 7.22 kb ██▅███▅▅▅██▁▅▅▁▅█▁▅█▅
3.24 ipc ( 97.94% cache) 26.27 branch misses
16.30k cycles 52.82k instructions 982.95 c-refs 20.25 c-misses
are-deeply-equal 20.47 µs/iter 20.37 µs █
(20.02 µs … 21.59 µs) 21.45 µs ███
( 10.36 kb … 10.37 kb) 10.37 kb ████▁█▁▁▁▁▁▁▁▁▁▁▁▁▁██
2.79 ipc ( 98.30% cache) 66.78 branch misses
77.81k cycles 216.94k instructions 1.95k c-refs 33.17 c-misses
fast-equals 18.66 µs/iter 19.00 µs ▇ █
(17.12 µs … 200.50 µs) 23.56 µs ▇█▅ █▇▂
( 4.59 kb … 252.41 kb) 7.74 kb ▁███████▅▂▁▁▁▁▁▁▁▁▁▁▁
2.73 ipc ( 98.48% cache) 56.79 branch misses
75.22k cycles 205.56k instructions 1.97k c-refs 29.99 c-misses
dequal 19.09 µs/iter 19.11 µs █ █
(18.69 µs … 19.89 µs) 19.54 µs ▅▅ ▅▅ █ ▅█ ▅ ▅
( 3.61 kb … 3.62 kb) 3.61 kb ██▁▁██▁█▁██▁█▁▁▁▁▁▁▁█
2.68 ipc ( 99.00% cache) 26.64 branch misses
78.03k cycles 208.85k instructions 1.49k c-refs 14.96 c-misses
lodash.isEqual 29.15 µs/iter 28.89 µs █
(27.93 µs … 252.78 µs) 35.56 µs ▇█
( 2.03 kb … 612.27 kb) 14.95 kb ▁██▇▂▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.66 ipc ( 97.83% cache) 63.46 branch misses
121.31k cycles 322.50k instructions 5.77k c-refs 125.45 c-misses
node.isDeepStrictEqual 19.45 µs/iter 19.27 µs █
(17.27 µs … 237.33 µs) 26.13 µs █
(912.00 b … 273.44 kb) 9.12 kb ▁▁▁██▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.72 ipc ( 98.67% cache) 56.87 branch misses
76.01k cycles 206.97k instructions 2.51k c-refs 33.23 c-misses
summary
object-equals
4.68x faster than fast-equals
4.79x faster than dequal
4.88x faster than node.isDeepStrictEqual
5.13x faster than are-deeply-equal
7.31x faster than lodash.isEqual
• Nested Object with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 180.93 µs/iter 180.51 µs █
(174.24 µs … 434.02 µs) 213.86 µs ▄█
(232.00 b … 643.56 kb) 237.28 kb ▁██▇▆▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
2.96 ipc ( 80.12% cache) 911.68 branch misses
699.13k cycles 2.07M instructions 68.75k c-refs 13.67k c-misses
are-deeply-equal 677.69 µs/iter 688.34 µs ██
(636.52 µs … 991.67 µs) 819.38 µs ▅▅ ██
(338.62 kb … 384.68 kb) 341.70 kb ▃██▇▆██▃▂▁▁▁▁▁▁▁▁▁▁▁▁
2.69 ipc ( 79.63% cache) 2.30k branch misses
2.67M cycles 7.16M instructions 152.67k c-refs 31.11k c-misses
fast-equals 659.85 µs/iter 649.81 µs █
(609.59 µs … 1.07 ms) 847.68 µs █
(236.17 kb … 256.20 kb) 236.40 kb ▁▅██▃▁▁▁▁▂▁▂▂▄▃▁▁▁▁▁▁
2.76 ipc ( 79.59% cache) 1.27k branch misses
2.46M cycles 6.78M instructions 109.44k c-refs 22.33k c-misses
dequal 1.01 ms/iter 1.01 ms █
(973.07 µs … 1.25 ms) 1.13 ms ▄█▅
(126.14 kb … 324.13 kb) 128.48 kb ▃█▇███▅▂▁▁▁▁▁▁▁▁▁▁▁▁▁
2.49 ipc ( 75.68% cache) 2.88k branch misses
3.86M cycles 9.61M instructions 114.36k c-refs 27.81k c-misses
lodash.isEqual 1.04 ms/iter 1.04 ms █▂
(987.58 µs … 1.32 ms) 1.19 ms ██
(232.80 kb … 1.11 mb) 443.21 kb ▂▂▄▄██▆▃▂▁▂▂▁▁▁▁▁▁▁▁▁
2.59 ipc ( 87.38% cache) 6.13k branch misses
4.03M cycles 10.44M instructions 257.68k c-refs 32.53k c-misses
node.isDeepStrictEqual 608.04 µs/iter 610.65 µs █
(585.32 µs … 873.17 µs) 718.15 µs ▄██▇
(237.37 kb … 333.46 kb) 284.31 kb ▃████▇▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.73 ipc ( 76.99% cache) 1.21k branch misses
2.49M cycles 6.77M instructions 112.22k c-refs 25.82k c-misses
summary
object-equals
3.36x faster than node.isDeepStrictEqual
3.65x faster than fast-equals
3.75x faster than are-deeply-equal
5.56x faster than dequal
5.74x faster than lodash.isEqual
• Nested Object with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 8.53 ms/iter 8.55 ms █▃
(8.06 ms … 9.91 ms) 9.84 ms ███
( 2.13 mb … 2.16 mb) 2.14 mb ███▃▇▄▁▁▂▁▁▂▄▁▁▃▁▂▇▄▄
1.50 ipc ( 80.90% cache) 71.66k branch misses
32.60M cycles 48.79M instructions 1.92M c-refs 366.23k c-misses
are-deeply-equal 13.38 ms/iter 13.32 ms ▆█
(12.94 ms … 15.53 ms) 15.48 ms ▅██
( 2.27 mb … 3.17 mb) 3.14 mb ████▄▄▃▁▄▁▁▁▁▁▁▁▁▁▁▁▆
1.75 ipc ( 86.71% cache) 101.11k branch misses
51.17M cycles 89.53M instructions 3.17M c-refs 421.32k c-misses
fast-equals 11.73 ms/iter 11.80 ms ▄█ ▄ █
(11.60 ms … 12.06 ms) 11.96 ms █████ ▅▅ ██ █
( 2.13 mb … 2.16 mb) 2.14 mb ██████████▅██▁█▁█▁▅▁█
1.64 ipc ( 76.24% cache) 72.18k branch misses
45.14M cycles 74.07M instructions 1.66M c-refs 394.89k c-misses
dequal 13.57 ms/iter 13.79 ms █
(13.17 ms … 13.89 ms) 13.89 ms ▆▆▃ ▆ ▃ █▃▃▆▆▃
( 1.28 mb … 1.29 mb) 1.29 mb ▄███▄█▁▄█▄▁▄▁▄▁██████
1.80 ipc ( 82.98% cache) 84.35k branch misses
53.82M cycles 96.98M instructions 2.06M c-refs 350.62k c-misses
lodash.isEqual 16.18 ms/iter 16.47 ms █
(15.81 ms … 16.82 ms) 16.80 ms █▃
( 4.01 mb … 4.46 mb) 4.02 mb ▃▇██▅▁▅▁▁▃▅▃▃▃▅▁█▁▃▃▃
1.81 ipc ( 93.16% cache) 112.62k branch misses
65.35M cycles 118.22M instructions 6.91M c-refs 472.58k c-misses
node.isDeepStrictEqual 11.21 ms/iter 11.25 ms ▂█▂ █
(11.06 ms … 11.57 ms) 11.46 ms ▅███▇▂█▇▂
( 2.51 mb … 2.54 mb) 2.54 mb ▄▄█████████▄▁▄▄▄▇▄▁▁▄
1.63 ipc ( 86.14% cache) 78.78k branch misses
45.80M cycles 74.53M instructions 2.79M c-refs 386.88k c-misses
summary
object-equals
1.31x faster than node.isDeepStrictEqual
1.38x faster than fast-equals
1.57x faster than are-deeply-equal
1.59x faster than dequal
1.9x faster than lodash.isEqual
• Nested Object with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 36.73 ms/iter 36.77 ms █
(36.36 ms … 37.72 ms) 37.60 ms ▂ █ ▇ ▂
( 8.60 mb … 8.60 mb) 8.60 mb █▁█▆█▁▁█▁▁▁▁▁▁▁▆▁▁▁▁▆
1.32 ipc ( 74.96% cache) 327.27k branch misses
148.62M cycles 195.86M instructions 7.08M c-refs 1.77M c-misses
are-deeply-equal 61.65 ms/iter 61.46 ms █
(60.66 ms … 65.22 ms) 63.17 ms ██ █
( 12.50 mb … 12.56 mb) 12.53 mb ███▁▁██▁█▁▁▁▁▁▁▁▁▁▁▁█
1.46 ipc ( 81.40% cache) 443.13k branch misses
246.26M cycles 358.88M instructions 12.60M c-refs 2.34M c-misses
fast-equals 51.14 ms/iter 51.15 ms ██
(50.93 ms … 51.50 ms) 51.47 ms ▅██▅ ▅ ▅▅
( 8.58 mb … 8.58 mb) 8.58 mb ████▁▁▁▁█▁▁▁▁▁▁▁▁▁▁██
1.45 ipc ( 74.16% cache) 324.73k branch misses
208.75M cycles 303.38M instructions 7.99M c-refs 2.07M c-misses
dequal 61.98 ms/iter 62.01 ms ██ █ █
(61.29 ms … 64.30 ms) 62.51 ms ▅ ▅██ █ █ ▅
( 5.17 mb … 5.19 mb) 5.19 mb █▁▁▁███▁█▁▁▁█▁▁▁▁▁▁▁█
1.57 ipc ( 79.06% cache) 389.79k branch misses
252.13M cycles 396.10M instructions 9.83M c-refs 2.06M c-misses
lodash.isEqual 71.95 ms/iter 72.71 ms █
(69.40 ms … 79.58 ms) 74.03 ms █ █
( 16.13 mb … 16.21 mb) 16.14 mb ██▁█▁▁▁▁▁██▁▁▁█▁█▁▁▁█
1.70 ipc ( 91.63% cache) 493.84k branch misses
283.53M cycles 482.36M instructions 29.31M c-refs 2.45M c-misses
node.isDeepStrictEqual 51.27 ms/iter 51.36 ms █ █ ██ ██ █ █ █
(51.03 ms … 51.56 ms) 51.48 ms █ █ ██ ██ █ █ █
( 10.10 mb … 10.13 mb) 10.13 mb █▁█▁▁▁██▁██▁▁▁▁█▁█▁▁█
1.47 ipc ( 83.72% cache) 354.52k branch misses
208.80M cycles 306.59M instructions 12.95M c-refs 2.11M c-misses
summary
object-equals
1.39x faster than fast-equals
1.4x faster than node.isDeepStrictEqual
1.68x faster than are-deeply-equal
1.69x faster than dequal
1.96x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 82.33 ns | 2.39 µs | 17.81 µs | 72.42 µs | 1.00x (baseline) |
dequal | 148.52 ns | 4.06 µs | 32.60 µs | 134.75 µs | 1.80x-1.86x slower |
fast-equals | 161.44 ns | 4.32 µs | 33.20 µs | 137.47 µs | 1.96x-1.90x slower |
are-deeply-equal | 203.61 ns | 4.05 µs | 32.62 µs | 136.20 µs | 2.47x-1.88x slower |
lodash.isEqual | 230.45 ns | 3.75 µs | 27.93 µs | 109.87 µs | 2.80x-1.52x slower |
node.isDeepStrictEqual | 462.38 ns | 4.31 µs | 30.62 µs | 121.78 µs | 5.62x-1.68x slower |
Full benchmark results with hardware counters
clk: ~3.70 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Array with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 82.33 ns/iter 82.15 ns █▅
(78.53 ns … 173.76 ns) 113.85 ns ██
( 0.10 b … 104.21 b) 0.41 b ▆██▆▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.03 ipc ( 86.99% cache) 0.01 branch misses
334.20 cycles 1.35k instructions 0.09 c-refs 0.01 c-misses
are-deeply-equal 203.61 ns/iter 206.48 ns █
(191.05 ns … 272.43 ns) 250.34 ns █▆ █
( 23.86 b … 328.23 b) 184.24 b ▃██▆▅█▇▃▂▁▁▁▂▁▁▂▂▂▂▁▁
3.14 ipc ( 95.95% cache) 1.02 branch misses
808.21 cycles 2.54k instructions 6.29 c-refs 0.25 c-misses
fast-equals 161.44 ns/iter 163.63 ns █
(156.54 ns … 238.54 ns) 176.34 ns ████ █
( 0.09 b … 144.15 b) 0.68 b ▅█████▄██▇▃▂▂▁▁▁▁▁▁▁▁
3.71 ipc ( 99.96% cache) 1.01 branch misses
622.41 cycles 2.31k instructions 28.00 c-refs 0.01 c-misses
dequal 148.52 ns/iter 151.87 ns █▅
(137.42 ns … 198.44 ns) 166.51 ns ▂▂▇██ ▇▄
( 0.09 b … 130.16 b) 0.54 b ▂▇█▇██████▃▃██▄▂▁▁▁▁▁
3.70 ipc ( 90.00% cache) 1.01 branch misses
581.78 cycles 2.15k instructions 0.09 c-refs 0.01 c-misses
lodash.isEqual 230.45 ns/iter 230.05 ns █
(221.05 ns … 347.38 ns) 279.52 ns ▂█▇
(220.38 b … 762.50 b) 528.25 b ▃███▆▃▂▁▁▁▁▁▁▁▁▁▁▁▂▂▁
3.37 ipc ( 95.93% cache) 1.03 branch misses
946.63 cycles 3.19k instructions 18.02 c-refs 0.73 c-misses
node.isDeepStrictEqual 462.38 ns/iter 460.00 ns █
(420.00 ns … 44.22 µs) 660.00 ns ▃█
(440.00 b … 465.69 kb) 453.76 b ▁▂██▂▂▃▃▁▁▁▁▁▁▁▁▁▁▁▁▁
1.61 ipc ( 99.76% cache) 31.05 branch misses
3.26k cycles 5.27k instructions 379.29 c-refs 0.91 c-misses
summary
object-equals
1.8x faster than dequal
1.96x faster than fast-equals
2.47x faster than are-deeply-equal
2.8x faster than lodash.isEqual
5.62x faster than node.isDeepStrictEqual
• Array with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 2.39 µs/iter 2.43 µs ▂ ▂ █▂▅
(2.18 µs … 2.76 µs) 2.68 µs ▅▂▅█▂█▅███ ▂ ▂ ▂
( 0.10 b … 0.53 b) 0.11 b ▄██████████▇▁█▁█▄█▄▇▄
3.73 ipc ( 99.96% cache) 1.04 branch misses
9.77k cycles 36.41k instructions 1.02k c-refs 0.43 c-misses
are-deeply-equal 4.05 µs/iter 4.13 µs █
(3.84 µs … 4.57 µs) 4.27 µs ▃▃█ ██▃▃▃
( 48.96 b … 184.50 b) 180.71 b ███▄▄▁█▁▁▄▁▁█████▁▁▁▄
3.84 ipc ( 99.73% cache) 1.10 branch misses
16.24k cycles 62.38k instructions 499.13 c-refs 1.35 c-misses
fast-equals 4.32 µs/iter 4.35 µs █
(4.19 µs … 4.89 µs) 4.81 µs █ ▃▃
( 0.09 b … 0.45 b) 0.10 b █▇██▅▅▃▃▁▁▅▁▁▃▁▁▁▃▁▁▃
4.00 ipc ( 99.86% cache) 2.10 branch misses
16.48k cycles 65.94k instructions 415.35 c-refs 0.57 c-misses
dequal 4.06 µs/iter 4.09 µs █▃
(3.98 µs … 4.28 µs) 4.25 µs ██▃
( 0.09 b … 0.41 b) 0.10 b ▆████▄▁▆█▄▁▁▁▁▁▆▁▄▄▁▆
3.97 ipc ( 99.89% cache) 1.06 branch misses
15.71k cycles 62.33k instructions 270.23 c-refs 0.31 c-misses
lodash.isEqual 3.75 µs/iter 3.75 µs ▃█
(3.66 µs … 4.66 µs) 4.06 µs ██ █▇
(519.58 b … 551.58 b) 528.92 b ██▆██▆▁▃▆▃▁▁▃▁▁▁▁▁▁▁▃
4.15 ipc ( 99.27% cache) 1.18 branch misses
14.62k cycles 60.69k instructions 487.42 c-refs 3.54 c-misses
node.isDeepStrictEqual 4.31 µs/iter 4.34 µs ▃ █ ▃█
(4.18 µs … 4.52 µs) 4.47 µs █ █ ██▂▂▂▂ ▇
( 55.97 b … 64.90 b) 63.83 b █▆▁▆▆█▆▆██████▁▁▁▁▁▆█
3.57 ipc ( 99.86% cache) 2.10 branch misses
16.67k cycles 59.43k instructions 512.23 c-refs 0.72 c-misses
summary
object-equals
1.57x faster than lodash.isEqual
1.69x faster than are-deeply-equal
1.7x faster than dequal
1.8x faster than node.isDeepStrictEqual
1.81x faster than fast-equals
• Array with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 17.81 µs/iter 17.80 µs █ █
(17.11 µs … 18.89 µs) 18.65 µs █ █
( 0.10 b … 0.53 b) 0.14 b ██▁▁█▁▁█▁█▁▁▁█▁▁▁▁▁▁█
4.14 ipc ( 98.01% cache) 1.22 branch misses
69.98k cycles 289.79k instructions 6.96k c-refs 138.21 c-misses
are-deeply-equal 32.62 µs/iter 32.76 µs █ █
(30.91 µs … 35.80 µs) 32.94 µs ▅ ▅ ▅ █▅█ ▅▅▅
(184.14 b … 184.48 b) 184.19 b █▁▁▁▁▁▁▁▁▁█▁█▁███▁███
3.97 ipc ( 98.93% cache) 1.69 branch misses
124.80k cycles 494.95k instructions 5.58k c-refs 59.70 c-misses
fast-equals 33.20 µs/iter 33.98 µs █
(32.07 µs … 34.05 µs) 34.01 µs █ ██
( 0.10 b … 0.45 b) 0.13 b ███▁▁█▁▁▁▁▁▁█▁▁▁▁▁▁██
4.02 ipc ( 99.00% cache) 3.14 branch misses
131.13k cycles 527.39k instructions 5.88k c-refs 58.52 c-misses
dequal 32.60 µs/iter 32.80 µs █
(31.82 µs … 35.14 µs) 33.26 µs █
( 0.10 b … 0.41 b) 0.13 b ▇▇▁▇▁█▁▁▁▇▁▁▁▁▇▁▇▁▁▁▇
4.01 ipc ( 99.82% cache) 1.34 branch misses
123.90k cycles 497.28k instructions 4.34k c-refs 8.04 c-misses
lodash.isEqual 27.93 µs/iter 28.43 µs █
(26.62 µs … 29.89 µs) 28.61 µs █ █
(423.10 b … 529.23 b) 519.49 b ██▁▁▁▁▁▁▁▁▁▁▁█▁▁█████
4.30 ipc ( 98.09% cache) 1.56 branch misses
110.21k cycles 473.46k instructions 5.76k c-refs 110.07 c-misses
node.isDeepStrictEqual 30.62 µs/iter 31.08 µs █ █
(29.71 µs … 32.45 µs) 31.17 µs ▅▅ ▅▅█ ▅▅█▅
( 64.10 b … 64.10 b) 64.10 b ██▁███▁▁▁▁▁▁▁▁▁▁▁████
3.68 ipc ( 99.12% cache) 1.68 branch misses
124.74k cycles 458.55k instructions 5.21k c-refs 45.65 c-misses
summary
object-equals
1.57x faster than lodash.isEqual
1.72x faster than node.isDeepStrictEqual
1.83x faster than dequal
1.83x faster than are-deeply-equal
1.86x faster than fast-equals
• Array with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 72.42 µs/iter 73.48 µs █
(68.94 µs … 128.78 µs) 85.85 µs ▄██
(360.00 b … 192.45 kb) 652.97 b ▂████▆▆▆▅▃▂▂▁▁▁▁▁▁▁▁▁
3.91 ipc ( 91.04% cache) 33.72 branch misses
296.28k cycles 1.16M instructions 41.84k c-refs 3.75k c-misses
are-deeply-equal 136.20 µs/iter 136.29 µs █
(122.18 µs … 389.85 µs) 193.09 µs ▆█▄
(544.00 b … 192.63 kb) 1.22 kb ▃████▆▃▂▂▂▂▂▂▁▁▁▁▁▁▁▁
3.80 ipc ( 93.22% cache) 38.84 branch misses
524.72k cycles 1.99M instructions 42.10k c-refs 2.86k c-misses
fast-equals 137.47 µs/iter 137.53 µs █
(133.58 µs … 239.86 µs) 187.91 µs █
( 0.00 b … 224.10 kb) 630.84 b ██▇▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.98 ipc ( 96.92% cache) 37.17 branch misses
529.63k cycles 2.11M instructions 38.49k c-refs 1.19k c-misses
dequal 134.75 µs/iter 135.74 µs █
(122.51 µs … 259.29 µs) 166.36 µs █
( 0.00 b … 160.44 kb) 507.74 b ▃▄▃▄▅▁█▂▄▂▁▁▁▁▁▁▁▁▁▁▁
3.79 ipc ( 90.38% cache) 35.62 branch misses
525.46k cycles 1.99M instructions 39.04k c-refs 3.76k c-misses
lodash.isEqual 109.87 µs/iter 107.70 µs █
(105.76 µs … 658.59 µs) 164.80 µs █▄
(528.00 b … 464.93 kb) 1.75 kb ██▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.23 ipc ( 96.31% cache) 37.84 branch misses
448.73k cycles 1.90M instructions 36.79k c-refs 1.36k c-misses
node.isDeepStrictEqual 121.78 µs/iter 122.61 µs █▂
(115.90 µs … 241.10 µs) 149.09 µs ▇██▃
( 64.00 b … 228.95 kb) 678.65 b ▃█████▅▃▂▂▁▁▁▁▁▁▁▁▁▁▁
3.67 ipc ( 96.43% cache) 36.88 branch misses
497.90k cycles 1.83M instructions 35.84k c-refs 1.28k c-misses
summary
object-equals
1.52x faster than lodash.isEqual
1.68x faster than node.isDeepStrictEqual
1.86x faster than dequal
1.88x faster than are-deeply-equal
1.9x faster than fast-equals
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 2.19 µs | 82.92 µs | 623.37 µs | 4.27 ms | 1.00x (baseline) |
dequal | 3.11 µs | 103.05 µs | 855.45 µs | 5.89 ms | 1.42x-1.38x slower |
fast-equals | 3.41 µs | 113.04 µs | 865.02 µs | 6.01 ms | 1.56x-1.41x slower |
are-deeply-equal | 4.07 µs | 141.15 µs | 1.21 ms | 7.92 ms | 1.86x-1.85x slower |
lodash.isEqual | 6.04 µs | 177.29 µs | 1.39 ms | 8.32 ms | 2.76x-1.95x slower |
node.isDeepStrictEqual | 8.06 µs | 249.32 µs | 1.96 ms | 10.62 ms | 3.68x-2.49x slower |
Full benchmark results with hardware counters
clk: ~3.66 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Nested Array with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 2.19 µs/iter 2.25 µs ▃▅▃ █
(2.10 µs … 2.52 µs) 2.36 µs ███▆█▆▃ ▆▃▃
( 0.16 b … 10.45 b) 0.31 b ████████▄▆▆▆███▁▆▄▁▄▆
3.55 ipc ( 99.58% cache) 21.11 branch misses
8.93k cycles 31.66k instructions 114.88 c-refs 0.49 c-misses
are-deeply-equal 4.07 µs/iter 4.15 µs █
(3.97 µs … 4.27 µs) 4.24 µs █
( 1.82 kb … 1.83 kb) 1.83 kb ███▆▆▁▃▆▃▁▁▃█▃█▆▃▃▃▁▃
3.27 ipc ( 98.68% cache) 39.67 branch misses
16.54k cycles 54.11k instructions 383.08 c-refs 5.04 c-misses
fast-equals 3.41 µs/iter 3.49 µs █ ▅
(3.16 µs … 3.75 µs) 3.72 µs ██ █▃
( 0.15 b … 2.43 b) 0.21 b ▆▄▆▁██▄▁▆▄▄██▆▁▄█▁▁▄▆
3.62 ipc ( 99.65% cache) 24.11 branch misses
13.01k cycles 47.08k instructions 138.15 c-refs 0.48 c-misses
dequal 3.11 µs/iter 3.16 µs ▃ █▅
(2.96 µs … 3.34 µs) 3.34 µs █▃ ██▆
( 0.15 b … 2.32 b) 0.20 b ███▄▁▆▄▆▄███▄▆▄▆▄▁▁▁▄
3.57 ipc ( 99.41% cache) 24.09 branch misses
12.01k cycles 42.86k instructions 78.16 c-refs 0.46 c-misses
lodash.isEqual 6.04 µs/iter 6.08 µs █ █
(5.95 µs … 6.16 µs) 6.16 µs █ █ █ ██ ██ █
( 5.56 kb … 5.78 kb) 5.67 kb ██▁█▁████▁████▁▁██▁▁█
3.09 ipc ( 97.45% cache) 24.62 branch misses
23.39k cycles 72.26k instructions 535.77 c-refs 13.65 c-misses
node.isDeepStrictEqual 8.06 µs/iter 8.09 µs █
(7.37 µs … 81.43 µs) 12.06 µs █
(672.00 b … 306.52 kb) 1.79 kb █▅▄█▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.66 ipc ( 99.49% cache) 56.42 branch misses
32.88k cycles 87.44k instructions 1.00k c-refs 5.14 c-misses
summary
object-equals
1.42x faster than dequal
1.56x faster than fast-equals
1.86x faster than are-deeply-equal
2.76x faster than lodash.isEqual
3.68x faster than node.isDeepStrictEqual
• Nested Array with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 82.92 µs/iter 82.55 µs █
(77.31 µs … 214.26 µs) 102.01 µs ▅█
(360.00 b … 208.10 kb) 783.32 b ▃█▂██▂▂▂▃▂▁▁▂▁▁▂▁▁▁▁▁
3.19 ipc ( 70.93% cache) 716.32 branch misses
316.53k cycles 1.01M instructions 31.85k c-refs 9.26k c-misses
are-deeply-equal 141.15 µs/iter 141.73 µs █
(135.96 µs … 502.33 µs) 204.41 µs ██▂
(424.00 b … 265.36 kb) 61.19 kb ███▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.16 ipc ( 77.01% cache) 1.36k branch misses
540.37k cycles 1.71M instructions 41.42k c-refs 9.52k c-misses
fast-equals 113.04 µs/iter 114.20 µs ▃ █▂
(106.80 µs … 223.84 µs) 137.34 µs █ ███
( 0.00 b … 172.83 kb) 563.26 b ▅█████▇▄▄▂▂▁▁▁▁▁▁▁▁▁▁
3.44 ipc ( 81.62% cache) 806.78 branch misses
436.12k cycles 1.50M instructions 27.66k c-refs 5.09k c-misses
dequal 103.05 µs/iter 107.72 µs █ ▅
(95.56 µs … 181.34 µs) 121.87 µs █ ▆ █
( 0.00 b … 160.44 kb) 409.26 b ▃██▅▇█▃▂▂██▂▂▄▂▁▁▁▁▁▁
3.41 ipc ( 80.58% cache) 815.14 branch misses
407.73k cycles 1.39M instructions 26.96k c-refs 5.24k c-misses
lodash.isEqual 177.29 µs/iter 175.50 µs █
(160.41 µs … 648.89 µs) 275.77 µs █
( 32.02 kb … 458.55 kb) 166.74 kb ▃▃█▇▂▁▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁
3.32 ipc ( 94.70% cache) 861.99 branch misses
675.02k cycles 2.24M instructions 37.42k c-refs 1.98k c-misses
node.isDeepStrictEqual 249.32 µs/iter 250.53 µs █
(240.70 µs … 401.26 µs) 279.37 µs ▆█▂▂
( 40.08 kb … 328.18 kb) 41.02 kb ▁▂████▆▄▂▂▂▁▁▁▁▁▁▁▁▁▁
2.79 ipc ( 94.99% cache) 834.22 branch misses
960.93k cycles 2.69M instructions 32.47k c-refs 1.63k c-misses
summary
object-equals
1.24x faster than dequal
1.36x faster than fast-equals
1.7x faster than are-deeply-equal
2.14x faster than lodash.isEqual
3.01x faster than node.isDeepStrictEqual
• Nested Array with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 623.37 µs/iter 639.31 µs ▃ ▂█
(573.94 µs … 782.21 µs) 690.68 µs ▆██▆▅▄▄██▆
( 48.00 b … 192.27 kb) 222.19 b ▂▃▄███████████▆▄▃▃▂▁▂
3.30 ipc ( 82.90% cache) 5.21k branch misses
2.47M cycles 8.13M instructions 239.12k c-refs 40.88k c-misses
are-deeply-equal 1.21 ms/iter 1.22 ms ▃█▄
(1.16 ms … 2.40 ms) 1.37 ms ████▃
(448.44 kb … 481.21 kb) 479.72 kb ▄██████▆▆▃▃▃▂▁▁▁▁▁▁▁▁
3.03 ipc ( 78.55% cache) 10.94k branch misses
4.50M cycles 13.62M instructions 328.47k c-refs 70.46k c-misses
fast-equals 865.02 µs/iter 863.93 µs █
(822.21 µs … 1.55 ms) 1.13 ms █
( 48.00 b … 1.43 kb) 49.74 b ▆█▄▃▅▂▂▁▁▁▁▁▁▁▂▁▁▁▁▁▁
3.49 ipc ( 78.55% cache) 6.27k branch misses
3.44M cycles 12.01M instructions 218.99k c-refs 46.97k c-misses
dequal 855.45 µs/iter 849.64 µs █
(814.34 µs … 1.22 ms) 1.07 ms ▇█
( 48.00 b … 1.28 kb) 49.53 b ▁██▅▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.41 ipc ( 78.11% cache) 6.20k branch misses
3.26M cycles 11.13M instructions 220.85k c-refs 48.35k c-misses
lodash.isEqual 1.39 ms/iter 1.39 ms █
(1.36 ms … 1.87 ms) 1.61 ms █▂
(851.82 kb … 1.29 mb) 1.29 mb ███▅▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
3.33 ipc ( 93.73% cache) 6.37k branch misses
5.36M cycles 17.87M instructions 297.66k c-refs 18.65k c-misses
node.isDeepStrictEqual 1.96 ms/iter 1.99 ms █▂
(1.86 ms … 2.47 ms) 2.32 ms ██ ▂▇
(320.11 kb … 320.13 kb) 320.11 kb ▃███▇██▅▃▂▂▂▂▂▂▁▂▁▂▁▁
2.80 ipc ( 95.91% cache) 6.43k branch misses
7.72M cycles 21.64M instructions 267.26k c-refs 10.94k c-misses
summary
object-equals
1.37x faster than dequal
1.39x faster than fast-equals
1.94x faster than are-deeply-equal
2.23x faster than lodash.isEqual
3.14x faster than node.isDeepStrictEqual
• Nested Array with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 4.27 ms/iter 4.31 ms █
(4.09 ms … 4.58 ms) 4.57 ms ▃▂█████▃
( 48.00 b … 1.75 kb) 58.51 b ▃▇██████████▅▇▃▇▂▁▃▁▂
1.99 ipc ( 88.19% cache) 20.67k branch misses
16.34M cycles 32.53M instructions 1.05M c-refs 123.46k c-misses
are-deeply-equal 7.92 ms/iter 7.96 ms █
(7.70 ms … 8.30 ms) 8.29 ms ▃▅ ███▅▅
( 1.75 mb … 1.78 mb) 1.78 mb ▄▃████████▆▄▃▃▄▁▄▃▄▃▃
1.97 ipc ( 83.21% cache) 43.46k branch misses
27.61M cycles 54.51M instructions 1.46M c-refs 244.82k c-misses
fast-equals 6.01 ms/iter 6.04 ms █▄ ▃
(5.87 ms … 6.35 ms) 6.31 ms ▄▄███▄█
( 48.00 b … 1.43 kb) 60.00 b ▄█████████▆█▂▅▂▂▂▁▂▁▄
2.10 ipc ( 85.19% cache) 24.93k branch misses
23.03M cycles 48.27M instructions 1.08M c-refs 160.25k c-misses
dequal 5.89 ms/iter 5.94 ms ▄▆█▄
(5.79 ms … 6.19 ms) 6.12 ms ▂▅████▅██▅▄ ▄
( 48.00 b … 1.28 kb) 58.53 b ███████████▆█▃▅▁▃▅▃▁▃
1.97 ipc ( 83.76% cache) 24.73k branch misses
22.63M cycles 44.50M instructions 1.02M c-refs 166.37k c-misses
lodash.isEqual 8.32 ms/iter 8.48 ms █▃
(8.02 ms … 9.14 ms) 8.77 ms ██▂▂▅▅▅ █ ▂▂ ▅▂
( 5.16 mb … 5.28 mb) 5.16 mb ▆███████▆█▃█████▆▃▆▃▃
2.17 ipc ( 83.51% cache) 25.35k branch misses
33.12M cycles 71.81M instructions 1.31M c-refs 216.80k c-misses
node.isDeepStrictEqual 10.62 ms/iter 10.70 ms █ ▂
(10.39 ms … 10.96 ms) 10.94 ms ▅ ▅▇▅▂█▇█▂▂▂▂
( 1.25 mb … 1.25 mb) 1.25 mb ▄█▇███████████▄▇▇▁▇▁▄
2.14 ipc ( 84.58% cache) 25.27k branch misses
40.56M cycles 86.60M instructions 1.19M c-refs 184.19k c-misses
summary
object-equals
1.38x faster than dequal
1.41x faster than fast-equals
1.85x faster than are-deeply-equal
1.95x faster than lodash.isEqual
2.49x faster than node.isDeepStrictEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 395.99 ns | 17.50 µs | 200.67 µs | 735.97 µs | 1.00x (baseline) |
dequal | 508.43 ns | 19.43 µs | 213.86 µs | 797.60 µs | 1.28x-1.08x slower |
are-deeply-equal | 609.52 ns | 21.74 µs | 214.69 µs | 826.17 µs | 1.54x-1.12x slower |
node.isDeepStrictEqual | 764.66 ns | 18.79 µs | 204.95 µs | 773.55 µs | 1.93x-1.05x slower |
fast-equals | 1.35 µs | 868.07 µs | 55.61 ms | 918.17 ms | 3.42x-1247.57x slower |
lodash.isEqual | 11.87 µs | 1.42 ms | 72.35 ms | 1.06 s | 29.97x-1435.69x slower |
Full benchmark results with hardware counters
clk: ~3.66 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Map with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 395.99 ns/iter 405.38 ns █
(370.75 ns … 665.25 ns) 466.98 ns ▃█ ▄▅
(786.85 b … 1.78 kb) 1.01 kb ██▇██▆▇▇▆▄▅▅▃▂▃▂▂▂▂▁▂
3.85 ipc ( 96.37% cache) 0.10 branch misses
1.52k cycles 5.84k instructions 34.18 c-refs 1.24 c-misses
are-deeply-equal 609.52 ns/iter 622.71 ns █
(577.49 ns … 729.98 ns) 697.52 ns ███ ▆▄
(899.74 b … 3.52 kb) 1.19 kb ▅████▇▇██▇▃▃▄▃▄▂▁▁▁▁▂
3.07 ipc ( 95.95% cache) 1.18 branch misses
2.35k cycles 7.19k instructions 41.04 c-refs 1.66 c-misses
fast-equals 1.35 µs/iter 1.38 µs ▂ █▇
(1.27 µs … 1.59 µs) 1.56 µs ▃█▇████▅▃▅
( 9.63 kb … 12.63 kb) 9.70 kb ██████████▇▄▅▂▁▄▂▁▂▂▂
3.49 ipc ( 96.57% cache) 9.12 branch misses
5.19k cycles 18.08k instructions 326.95 c-refs 11.22 c-misses
dequal 508.43 ns/iter 513.87 ns █▂
(475.90 ns … 603.94 ns) 571.43 ns ▂ ██
(723.76 b … 1.78 kb) 1.00 kb ▂▆██▅▄▆██▄▂▃▂▂▂▂▂▂▂▂▁
3.60 ipc ( 96.43% cache) 2.18 branch misses
1.99k cycles 7.18k instructions 34.11 c-refs 1.22 c-misses
lodash.isEqual 11.87 µs/iter 11.59 µs █
(10.72 µs … 250.21 µs) 20.55 µs █
(256.00 b … 679.21 kb) 26.13 kb ▄█▇▂▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.43 ipc ( 98.01% cache) 64.84 branch misses
48.64k cycles 118.08k instructions 4.73k c-refs 93.85 c-misses
node.isDeepStrictEqual 764.66 ns/iter 768.47 ns █▂▃
(740.86 ns … 918.63 ns) 846.55 ns ███▇
( 1.09 kb … 1.87 kb) 1.25 kb ██████▅▄▂▃▆▄▂▄▃▂▂▂▂▂▂
3.13 ipc ( 95.37% cache) 0.12 branch misses
3.12k cycles 9.76k instructions 52.48 c-refs 2.43 c-misses
summary
object-equals
1.28x faster than dequal
1.54x faster than are-deeply-equal
1.93x faster than node.isDeepStrictEqual
3.42x faster than fast-equals
29.97x faster than lodash.isEqual
• Map with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 17.50 µs/iter 17.55 µs █
(16.65 µs … 18.52 µs) 18.47 µs █ █
( 8.13 b … 8.44 b) 8.16 b █▁█▁▁██▁███▁▁▁▁▁▁▁▁▁█
2.82 ipc ( 98.86% cache) 242.55 branch misses
65.99k cycles 186.03k instructions 6.34k c-refs 71.92 c-misses
are-deeply-equal 21.74 µs/iter 21.69 µs █
(21.28 µs … 23.80 µs) 22.17 µs ██
(192.25 b … 192.44 b) 192.26 b █▁██▁▁█▁██▁▁▁█▁▁▁▁▁▁█
2.60 ipc ( 98.94% cache) 343.52 branch misses
82.04k cycles 213.17k instructions 6.89k c-refs 72.99 c-misses
fast-equals 868.07 µs/iter 909.24 µs █
(776.05 µs … 1.24 ms) 1.15 ms ▄█
( 8.05 mb … 8.06 mb) 8.05 mb ▂██▇▄▃▃▄▃▂▂▄▄▃▂▂▁▂▁▁▁
3.21 ipc ( 96.64% cache) 1.08k branch misses
3.33M cycles 10.71M instructions 335.01k c-refs 11.27k c-misses
dequal 19.43 µs/iter 19.49 µs █ █
(19.27 µs … 19.66 µs) 19.51 µs ▅ ▅▅█ ▅ ▅ ▅ ▅█
( 8.13 b … 8.38 b) 8.16 b █▁▁▁▁▁███▁▁▁█▁▁█▁█▁██
2.93 ipc ( 99.00% cache) 302.13 branch misses
74.64k cycles 218.61k instructions 6.09k c-refs 60.85 c-misses
lodash.isEqual 1.42 ms/iter 1.34 ms █
(1.27 ms … 2.27 ms) 2.22 ms █
(272.52 kb … 1.49 mb) 769.87 kb ██▂▃▁▂▁▁▁▁▁▁▁▁▁▁▁▁▃▂▂
3.84 ipc ( 97.28% cache) 1.11k branch misses
5.51M cycles 21.14M instructions 175.46k c-refs 4.77k c-misses
node.isDeepStrictEqual 18.79 µs/iter 19.29 µs █
(18.16 µs … 19.52 µs) 19.45 µs ▅▅█▅ ▅ ▅ ▅ ▅▅ ▅
(264.11 b … 264.95 b) 264.21 b ████▁▁▁█▁▁█▁▁▁▁█▁██▁█
2.81 ipc ( 98.49% cache) 289.49 branch misses
74.42k cycles 208.83k instructions 6.42k c-refs 97.17 c-misses
summary
object-equals
1.07x faster than node.isDeepStrictEqual
1.11x faster than dequal
1.24x faster than are-deeply-equal
49.61x faster than fast-equals
81.37x faster than lodash.isEqual
• Map with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 200.67 µs/iter 200.36 µs █
(189.78 µs … 400.09 µs) 290.50 µs ▇█
( 11.37 kb … 498.98 kb) 257.00 kb ███▆▃▂▁▁▂▂▂▂▁▁▁▁▁▁▁▁▁
1.88 ipc ( 79.19% cache) 3.93k branch misses
801.55k cycles 1.51M instructions 93.99k c-refs 19.56k c-misses
are-deeply-equal 214.69 µs/iter 215.18 µs █
(206.47 µs … 441.46 µs) 268.70 µs █
( 12.11 kb … 512.33 kb) 256.99 kb ▂██▇▃▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
1.95 ipc ( 79.47% cache) 3.85k branch misses
873.61k cycles 1.70M instructions 93.97k c-refs 19.29k c-misses
fast-equals 55.61 ms/iter 56.44 ms ██ █ █ █ █ ██
(54.79 ms … 56.56 ms) 56.52 ms ██ █ █ █ █ ██
(608.03 kb … 608.84 kb) 608.75 kb ██▁█▁█▁█▁█▁▁▁▁▁▁▁▁▁██
3.18 ipc ( 97.41% cache) 18.32k branch misses
211.21M cycles 672.02M instructions 24.90M c-refs 644.67k c-misses
dequal 213.86 µs/iter 213.66 µs ██
(206.37 µs … 439.89 µs) 307.78 µs ██▂
( 45.25 kb … 544.15 kb) 256.61 kb ███▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.13 ipc ( 83.42% cache) 3.97k branch misses
821.31k cycles 1.75M instructions 82.81k c-refs 13.73k c-misses
lodash.isEqual 72.35 ms/iter 67.72 ms ██
(66.07 ms … 118.95 ms) 81.48 ms ██
( 5.98 mb … 6.22 mb) 6.01 mb ██▇▇▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇
4.29 ipc ( 98.03% cache) 11.86k branch misses
277.02M cycles 1.19G instructions 3.52M c-refs 69.53k c-misses
node.isDeepStrictEqual 204.95 µs/iter 209.43 µs █▂
(193.03 µs … 424.75 µs) 256.29 µs ██▂ ▄
( 58.79 kb … 544.40 kb) 256.90 kb ▇███▇██▅▃▃▂▁▁▁▁▁▁▁▁▁▁
1.98 ipc ( 83.03% cache) 4.06k branch misses
824.20k cycles 1.64M instructions 82.70k c-refs 14.03k c-misses
summary
object-equals
1.02x faster than node.isDeepStrictEqual
1.07x faster than dequal
1.07x faster than are-deeply-equal
277.11x faster than fast-equals
360.55x faster than lodash.isEqual
• Map with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 735.97 µs/iter 728.47 µs █
(709.24 µs … 1.10 ms) 977.23 µs █
( 1.00 mb … 1.00 mb) 1.00 mb ▅█▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.84 ipc ( 75.89% cache) 9.18k branch misses
2.97M cycles 5.48M instructions 303.87k c-refs 73.27k c-misses
are-deeply-equal 826.17 µs/iter 824.45 µs █▇
(800.41 µs … 1.09 ms) 1.01 ms ██
(977.63 kb … 1.05 mb) 1.00 mb ▃██▇▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.87 ipc ( 76.22% cache) 9.18k branch misses
3.37M cycles 6.31M instructions 325.15k c-refs 77.33k c-misses
fast-equals 918.17 ms/iter 928.62 ms █ █ ████ █ █ █ ██
(895.77 ms … 938.84 ms) 935.23 ms █ █ ████ █ █ █ ██
( 5.63 mb … 17.74 mb) 6.73 mb █▁█▁▁▁████▁▁█▁█▁▁█▁██
3.71 ipc ( 97.24% cache) 162.16k branch misses
3.58G cycles 13.28G instructions 430.40M c-refs 11.87M c-misses
dequal 797.60 µs/iter 794.20 µs █
(779.02 µs … 1.28 ms) 974.23 µs █
( 1.00 mb … 1.00 mb) 1.00 mb ▃█▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.01 ipc ( 75.47% cache) 9.19k branch misses
3.25M cycles 6.53M instructions 296.09k c-refs 72.64k c-misses
lodash.isEqual 1.06 s/iter 1.02 s █ █
(955.15 ms … 1.72 s) 1.03 s ▅█ ▅ ▅▅▅█▅ ▅
( 24.02 mb … 24.41 mb) 24.16 mb ██▁█▁▁▁▁▁▁▁▁▁▁█████▁█
4.35 ipc ( 98.27% cache) 57.33k branch misses
4.12G cycles 17.92G instructions 57.14M c-refs 987.87k c-misses
node.isDeepStrictEqual 773.55 µs/iter 766.45 µs █
(743.28 µs … 1.85 ms) 977.84 µs █▃
(767.20 kb … 1.26 mb) 1.00 mb ▃██▄▂▂▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁
1.91 ipc ( 75.07% cache) 9.30k branch misses
3.13M cycles 5.99M instructions 287.41k c-refs 71.66k c-misses
summary
object-equals
1.05x faster than node.isDeepStrictEqual
1.08x faster than dequal
1.12x faster than are-deeply-equal
1247.57x faster than fast-equals
1435.69x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 11.11 µs | 452.49 µs | 5.36 ms | 25.96 ms | 1.00x (baseline) |
dequal | 12.52 µs | 492.70 µs | 5.59 ms | 29.22 ms | 1.13x-1.13x slower |
are-deeply-equal | 14.16 µs | 534.26 µs | 7.60 ms | 32.83 ms | 1.28x-1.26x slower |
node.isDeepStrictEqual | 19.28 µs | 676.61 µs | 7.97 ms | 33.75 ms | 1.74x-1.30x slower |
fast-equals | 27.01 µs | 1.84 ms | 64.92 ms | 979.69 ms | 2.43x-37.73x slower |
lodash.isEqual | 288.05 µs | 10.14 ms | 143.49 ms | 1.41 s | 25.93x-54.35x slower |
Full benchmark results with hardware counters
clk: ~3.67 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Nested Map with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 11.11 µs/iter 10.95 µs █
(9.60 µs … 223.26 µs) 17.85 µs █▃
( 5.31 kb … 262.25 kb) 21.64 kb ▃▆██▄▂▂▃▂▁▁▁▁▁▁▁▁▁▁▁▁
2.86 ipc ( 97.58% cache) 180.03 branch misses
43.69k cycles 125.12k instructions 3.15k c-refs 76.23 c-misses
are-deeply-equal 14.16 µs/iter 14.04 µs █▃
(12.84 µs … 253.86 µs) 21.43 µs ██
( 6.68 kb … 295.95 kb) 23.46 kb ▄███▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.67 ipc ( 97.09% cache) 219.62 branch misses
56.47k cycles 150.74k instructions 3.87k c-refs 112.39 c-misses
fast-equals 27.01 µs/iter 26.11 µs █
(23.77 µs … 259.97 µs) 42.84 µs █
( 50.43 kb … 599.16 kb) 203.32 kb ▁██▅▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.42 ipc ( 96.05% cache) 270.15 branch misses
111.22k cycles 380.70k instructions 10.07k c-refs 397.70 c-misses
dequal 12.52 µs/iter 12.77 µs █
(12.05 µs … 13.22 µs) 13.19 µs █
( 5.00 kb … 6.67 kb) 5.17 kb ██▁█▁▁▁▁█▁▁▁▁█▁█▁▁▁▁█
3.02 ipc ( 98.18% cache) 179.19 branch misses
46.84k cycles 141.39k instructions 2.54k c-refs 46.26 c-misses
lodash.isEqual 288.05 µs/iter 282.13 µs █
(271.95 µs … 1.18 ms) 505.78 µs █▆
( 32.52 kb … 1.98 mb) 531.31 kb ██▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.56 ipc ( 97.46% cache) 1.06k branch misses
1.11M cycles 2.84M instructions 97.09k c-refs 2.46k c-misses
node.isDeepStrictEqual 19.28 µs/iter 18.83 µs █
(17.85 µs … 250.06 µs) 28.53 µs █▂
(384.00 b … 391.17 kb) 26.56 kb ▁██▃▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.63 ipc ( 97.23% cache) 228.37 branch misses
75.05k cycles 197.67k instructions 4.01k c-refs 111.01 c-misses
summary
object-equals
1.13x faster than dequal
1.28x faster than are-deeply-equal
1.74x faster than node.isDeepStrictEqual
2.43x faster than fast-equals
25.93x faster than lodash.isEqual
• Nested Map with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 452.49 µs/iter 446.02 µs █
(418.46 µs … 744.53 µs) 639.76 µs █
(173.55 kb … 765.78 kb) 671.62 kb ▂▃█▄▂▁▁▁▁▂▂▁▁▁▁▁▁▁▁▁▁
2.33 ipc ( 80.04% cache) 11.85k branch misses
1.72M cycles 4.01M instructions 132.59k c-refs 26.46k c-misses
are-deeply-equal 534.26 µs/iter 535.58 µs █
(495.42 µs … 836.02 µs) 716.95 µs █
(538.07 kb … 920.90 kb) 730.90 kb ▂▃▃██▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.31 ipc ( 81.17% cache) 11.71k branch misses
2.07M cycles 4.78M instructions 159.65k c-refs 30.06k c-misses
fast-equals 1.84 ms/iter 1.95 ms █
(1.62 ms … 2.35 ms) 2.30 ms ▂██▃ ▂▆▆
( 14.08 mb … 14.08 mb) 14.08 mb █████████████▂▃▃▄▃▂▁▂
3.09 ipc ( 95.01% cache) 7.95k branch misses
7.07M cycles 21.88M instructions 633.75k c-refs 31.63k c-misses
dequal 492.70 µs/iter 492.52 µs █▄
(471.03 µs … 812.32 µs) 684.95 µs ██
(513.19 kb … 832.34 kb) 672.16 kb ███▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.45 ipc ( 80.32% cache) 11.58k branch misses
1.89M cycles 4.62M instructions 128.78k c-refs 25.34k c-misses
lodash.isEqual 10.14 ms/iter 10.29 ms ▅▂ █
(9.85 ms … 10.90 ms) 10.61 ms ██▅█▂▅ ▂▅▂▂▇ ▅
( 15.46 mb … 16.47 mb) 16.44 mb ▇██████▇█████▄▄█▁▇▄▄▄
2.67 ipc ( 97.88% cache) 27.71k branch misses
39.01M cycles 104.08M instructions 3.05M c-refs 64.70k c-misses
node.isDeepStrictEqual 676.61 µs/iter 684.53 µs █
(637.58 µs … 912.88 µs) 862.40 µs ▅ ▂█
(832.33 kb … 832.47 kb) 832.40 kb ▇█▆██▇▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁
2.35 ipc ( 81.09% cache) 11.97k branch misses
2.66M cycles 6.26M instructions 139.18k c-refs 26.32k c-misses
summary
object-equals
1.09x faster than dequal
1.18x faster than are-deeply-equal
1.5x faster than node.isDeepStrictEqual
4.06x faster than fast-equals
22.42x faster than lodash.isEqual
• Nested Map with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 5.36 ms/iter 5.44 ms ▃ █
(5.06 ms … 6.17 ms) 6.07 ms █▇█▇█ ▂
( 5.25 mb … 5.25 mb) 5.25 mb ▅█████████▄▃▂▂▃▃▃▁▂▂▃
1.39 ipc ( 79.35% cache) 91.49k branch misses
21.28M cycles 29.68M instructions 982.42k c-refs 202.84k c-misses
are-deeply-equal 7.60 ms/iter 7.79 ms ██▃█
(6.83 ms … 8.50 ms) 8.33 ms ▅ █▇████▅▂ █▇
( 5.66 mb … 5.73 mb) 5.72 mb ▃▁▁▁██████████▃██▃█▁▃
1.38 ipc ( 77.83% cache) 99.78k branch misses
27.79M cycles 38.27M instructions 1.41M c-refs 311.51k c-misses
fast-equals 64.92 ms/iter 65.23 ms █ █
(63.86 ms … 66.73 ms) 65.64 ms ▅ ▅ ▅█ █ ▅ ▅ ▅▅
( 48.79 mb … 48.79 mb) 48.79 mb █▁▁█▁▁██▁█▁▁▁█▁█▁▁▁██
3.09 ipc ( 96.67% cache) 74.79k branch misses
247.37M cycles 764.39M instructions 27.48M c-refs 915.44k c-misses
dequal 5.59 ms/iter 5.66 ms ▃▃ ▆█▅
(5.31 ms … 6.13 ms) 5.98 ms ███▃███▅ ▅
( 5.25 mb … 5.25 mb) 5.25 mb ▃▃████████████▄▄█▁▄▃▃
1.54 ipc ( 80.18% cache) 91.56k branch misses
21.40M cycles 33.01M instructions 800.67k c-refs 158.68k c-misses
lodash.isEqual 143.49 ms/iter 144.79 ms █
(135.46 ms … 153.39 ms) 150.65 ms ▅ █
( 4.99 mb … 5.53 mb) 5.08 mb █▁▁▁▁▁▁▁▁█▇▇▇▁▇▁▁▁▁▁▇
3.29 ipc ( 97.95% cache) 221.49k branch misses
553.33M cycles 1.82G instructions 31.19M c-refs 639.05k c-misses
node.isDeepStrictEqual 7.97 ms/iter 8.07 ms █ ▄
(7.65 ms … 8.90 ms) 8.61 ms █▆▆██▆█▆ ▃
( 6.50 mb … 6.50 mb) 6.50 mb █████████▅▇▅▃▇█▁▃▅▁▁▇
1.60 ipc ( 77.69% cache) 93.33k branch misses
31.59M cycles 50.49M instructions 1.23M c-refs 273.67k c-misses
summary
object-equals
1.04x faster than dequal
1.42x faster than are-deeply-equal
1.49x faster than node.isDeepStrictEqual
12.12x faster than fast-equals
26.79x faster than lodash.isEqual
• Nested Map with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 25.96 ms/iter 26.29 ms ▂ █
(25.46 ms … 26.93 ms) 26.47 ms █ █ ▅ ▅ ▅
( 21.00 mb … 21.00 mb) 21.00 mb █▇▁█▇▁▁█▇▇▇▁▇▇▁▁█▇▇█▇
1.30 ipc ( 78.87% cache) 354.86k branch misses
98.55M cycles 128.01M instructions 4.62M c-refs 976.45k c-misses
are-deeply-equal 32.83 ms/iter 33.12 ms █
(32.16 ms … 33.65 ms) 33.65 ms ██ █ █ █
( 22.75 mb … 22.80 mb) 22.78 mb ███▁▁█▁█▁▁▁████▁▁▁█▁█
1.26 ipc ( 77.03% cache) 400.23k branch misses
121.71M cycles 153.68M instructions 5.44M c-refs 1.25M c-misses
fast-equals 979.69 ms/iter 987.46 ms █ █
(960.64 ms … 988.98 ms) 988.65 ms ▅ ▅ ▅ █▅▅ ▅█▅
( 6.94 mb … 6.94 mb) 6.94 mb █▁▁█▁▁▁▁▁█▁▁▁███▁▁███
3.58 ipc ( 96.82% cache) 357.27k branch misses
3.75G cycles 13.44G instructions 440.79M c-refs 14.02M c-misses
dequal 29.22 ms/iter 29.40 ms █
(28.66 ms … 29.98 ms) 29.92 ms █ ██ █ █ █
( 21.00 mb … 21.00 mb) 21.00 mb █▁████▁▁█████▁█▁█▁▁▁█
1.33 ipc ( 76.83% cache) 370.55k branch misses
111.21M cycles 148.06M instructions 4.67M c-refs 1.08M c-misses
lodash.isEqual 1.41 s/iter 1.43 s ██
(1.35 s … 1.44 s) 1.43 s ▅ ▅ ▅██▅▅▅▅
( 19.53 mb … 20.48 mb) 19.67 mb █▁▁▁█▁▁▁▁▁▁▁▁▁███████
3.79 ipc ( 97.40% cache) 929.57k branch misses
5.47G cycles 20.72G instructions 178.72M c-refs 4.65M c-misses
node.isDeepStrictEqual 33.75 ms/iter 33.93 ms █
(33.24 ms … 34.49 ms) 34.43 ms ▂ █
( 26.00 mb … 26.00 mb) 26.00 mb ▆▆▆▁█▆▁█▆▁▁▁▆▁▁▁▆▁▁▆▆
1.47 ipc ( 77.79% cache) 363.32k branch misses
136.89M cycles 201.83M instructions 5.15M c-refs 1.14M c-misses
summary
object-equals
1.13x faster than dequal
1.26x faster than are-deeply-equal
1.3x faster than node.isDeepStrictEqual
37.73x faster than fast-equals
54.35x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 140.51 ns | 3.69 µs | 43.47 µs | 234.04 µs | 1.00x (baseline) |
dequal | 168.72 ns | 4.15 µs | 48.58 µs | 265.02 µs | 1.20x-1.13x slower |
are-deeply-equal | 226.58 ns | 5.16 µs | 55.28 µs | 310.28 µs | 1.61x-1.33x slower |
fast-equals | 462.66 ns | 187.97 µs | 12.18 ms | 188.35 ms | 3.29x-804.76x slower |
node.isDeepStrictEqual | 471.02 ns | 4.18 µs | 44.28 µs | 245.33 µs | 3.35x-1.05x slower |
lodash.isEqual | 3.81 µs | 462.62 µs | 26.62 ms | 405.68 ms | 27.08x-1733.39x slower |
Full benchmark results with hardware counters
clk: ~3.68 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Set with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 140.51 ns/iter 139.00 ns █
(129.25 ns … 353.47 ns) 191.08 ns █▅
( 0.10 b … 737.46 b) 3.37 b ▁▆██▄▃▂▁▁▂▁▁▂▂▁▁▁▁▁▁▁
3.88 ipc ( 87.08% cache) 0.01 branch misses
562.13 cycles 2.18k instructions 0.31 c-refs 0.04 c-misses
are-deeply-equal 226.58 ns/iter 224.96 ns █
(214.98 ns … 330.96 ns) 295.16 ns █
(848.10 b … 2.77 kb) 0.99 kb ▆█▆▄▂▁▂▁▁▁▁▂▂▂▁▁▁▁▁▁▁
3.45 ipc ( 96.35% cache) 0.04 branch misses
910.62 cycles 3.14k instructions 33.57 c-refs 1.23 c-misses
fast-equals 462.66 ns/iter 462.51 ns █
(432.25 ns … 738.82 ns) 591.97 ns ▅█▂█
( 72.67 b … 3.65 kb) 130.82 b ████▅▄▃▂▂▄▁▂▂▃▂▂▂▂▁▁▁
4.66 ipc ( 93.96% cache) 1.06 branch misses
1.80k cycles 8.41k instructions 4.84 c-refs 0.29 c-misses
dequal 168.72 ns/iter 167.85 ns █
(158.81 ns … 386.81 ns) 222.35 ns ██
( 0.09 b … 704.44 b) 2.86 b ▄███▅▂▁▁▂▁▂▁▂▂▁▁▁▁▁▁▁
3.80 ipc ( 85.53% cache) 0.02 branch misses
676.65 cycles 2.57k instructions 0.24 c-refs 0.03 c-misses
lodash.isEqual 3.81 µs/iter 3.68 µs █
(3.33 µs … 225.73 µs) 6.06 µs █
(880.00 b … 1.01 mb) 3.43 kb ▂▅█▅▂▂▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁
2.41 ipc ( 97.53% cache) 51.79 branch misses
15.99k cycles 38.47k instructions 1.95k c-refs 48.28 c-misses
node.isDeepStrictEqual 471.02 ns/iter 476.52 ns ▃█▃▆
(430.75 ns … 689.93 ns) 602.17 ns ████▅
( 78.05 b … 937.26 b) 258.83 b ▆██████▅▃▃▂▄▂▃▃▂▂▂▁▁▂
3.00 ipc ( 95.37% cache) 0.05 branch misses
1.83k cycles 5.48k instructions 12.38 c-refs 0.57 c-misses
summary
object-equals
1.2x faster than dequal
1.61x faster than are-deeply-equal
3.29x faster than fast-equals
3.35x faster than node.isDeepStrictEqual
27.08x faster than lodash.isEqual
• Set with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 3.69 µs/iter 3.73 µs ▃ ▃█ ▃ █
(3.61 µs … 3.86 µs) 3.85 µs ▇█▂██▂ ▇▂█▇█
( 0.10 b … 0.53 b) 0.11 b ██████▆█████▆▆▁▁▁▁▆▁▆
3.82 ipc ( 99.87% cache) 25.36 branch misses
14.22k cycles 54.30k instructions 499.20 c-refs 0.67 c-misses
are-deeply-equal 5.16 µs/iter 5.18 µs ▃ █
(5.04 µs … 5.31 µs) 5.30 µs █▂ ▂█ ▂▇ ▂
( 5.67 kb … 5.68 kb) 5.68 kb ▆▁▁██▆██▆██▆█▁▆▆▁▆▁▆▆
3.45 ipc ( 97.94% cache) 28.21 branch misses
19.68k cycles 67.94k instructions 1.50k c-refs 30.94 c-misses
fast-equals 187.97 µs/iter 187.01 µs █
(179.19 µs … 1.05 ms) 246.40 µs █
( 3.05 kb … 227.16 kb) 3.74 kb ▃██▃▄▂▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁
5.06 ipc ( 96.73% cache) 538.79 branch misses
752.06k cycles 3.80M instructions 1.70k c-refs 55.57 c-misses
dequal 4.15 µs/iter 4.25 µs ██
(3.97 µs … 4.66 µs) 4.59 µs ██▅▅ ▅ █
( 0.09 b … 0.41 b) 0.10 b █████▅█▁██▅█▁▅▅▅▁▁▁▁▅
3.78 ipc ( 99.81% cache) 39.95 branch misses
16.51k cycles 62.48k instructions 421.42 c-refs 0.81 c-misses
lodash.isEqual 462.62 µs/iter 431.37 µs █
(398.56 µs … 1.20 ms) 1.05 ms █▆
( 35.89 kb … 1.51 mb) 39.23 kb ██▂▂▂▁▁▁▁▁▁▁▁▁▁▂▁▁▁▂▁
4.33 ipc ( 81.64% cache) 639.40 branch misses
1.75M cycles 7.56M instructions 8.53k c-refs 1.57k c-misses
node.isDeepStrictEqual 4.18 µs/iter 4.19 µs █
(4.11 µs … 4.55 µs) 4.40 µs █▄
(247.45 b … 257.60 b) 255.85 b ▅██▅▆▅▅▅▃▁▅▃▁▁▁▁▁▁▁▁▃
3.85 ipc ( 99.78% cache) 21.10 branch misses
16.14k cycles 62.14k instructions 877.47 c-refs 1.90 c-misses
summary
object-equals
1.12x faster than dequal
1.13x faster than node.isDeepStrictEqual
1.4x faster than are-deeply-equal
50.89x faster than fast-equals
125.24x faster than lodash.isEqual
• Set with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 43.47 µs/iter 43.54 µs █
(42.52 µs … 46.95 µs) 45.47 µs █
( 0.10 b … 0.53 b) 0.14 b ▆█▆▁▆▁▁▆▁▆▁▁▁▁▁▁▁▁▁▁▆
2.50 ipc ( 95.78% cache) 1.10k branch misses
173.60k cycles 433.99k instructions 21.40k c-refs 904.17 c-misses
are-deeply-equal 55.28 µs/iter 54.31 µs █
(51.93 µs … 270.61 µs) 79.59 µs █
( 28.27 kb … 331.46 kb) 171.24 kb ▂██▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.39 ipc ( 94.05% cache) 1.19k branch misses
226.23k cycles 541.39k instructions 30.58k c-refs 1.82k c-misses
fast-equals 12.18 ms/iter 12.40 ms █ ▄
(11.71 ms … 13.25 ms) 13.24 ms █ █▆
( 21.41 kb … 40.13 kb) 23.03 kb ▅█▇██▃▅▇▃▇▃▃▁▇▇▃▁▃▁▃▃
5.15 ipc ( 99.78% cache) 4.53k branch misses
45.79M cycles 235.89M instructions 1.17M c-refs 2.60k c-misses
dequal 48.58 µs/iter 48.90 µs █ █
(47.58 µs … 49.35 µs) 49.33 µs ▅ ▅ ▅▅ ▅ ▅█▅ █
( 0.01 b … 0.32 b) 0.04 b █▁█▁▁██▁█▁▁▁▁███▁▁▁▁█
2.69 ipc ( 97.77% cache) 1.15k branch misses
185.75k cycles 499.92k instructions 20.35k c-refs 452.77 c-misses
lodash.isEqual 26.62 ms/iter 29.25 ms █
(24.28 ms … 34.69 ms) 30.74 ms █▅ ▅
( 65.37 kb … 552.33 kb) 290.03 kb ██▄▇▁▁▁▁▁▁▁▁▁▁▁▄▁▁▁▄█
4.45 ipc ( 97.79% cache) 5.82k branch misses
106.17M cycles 472.90M instructions 615.84k c-refs 13.63k c-misses
node.isDeepStrictEqual 44.28 µs/iter 45.55 µs █ █
(42.14 µs … 48.94 µs) 46.22 µs █ █▅▅ ▅ ▅ ▅ ▅▅
(256.02 b … 256.86 b) 256.09 b █▁▁███▁▁▁█▁▁▁█▁▁▁█▁██
2.71 ipc ( 96.26% cache) 1.04k branch misses
172.82k cycles 468.76k instructions 21.86k c-refs 816.93 c-misses
summary
object-equals
1.02x faster than node.isDeepStrictEqual
1.12x faster than dequal
1.27x faster than are-deeply-equal
280.26x faster than fast-equals
612.44x faster than lodash.isEqual
• Set with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 234.04 µs/iter 233.40 µs █
(224.23 µs … 1.14 ms) 331.65 µs ██▅
( 0.00 b … 256.11 kb) 868.14 b ███▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.79 ipc ( 82.67% cache) 8.10k branch misses
944.93k cycles 1.69M instructions 93.90k c-refs 16.27k c-misses
are-deeply-equal 310.28 µs/iter 309.47 µs █
(287.26 µs … 627.71 µs) 476.50 µs █
( 35.38 kb … 989.19 kb) 683.25 kb ██▄▄▂▂▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁
1.73 ipc ( 77.95% cache) 8.28k branch misses
1.23M cycles 2.14M instructions 129.39k c-refs 28.54k c-misses
fast-equals 188.35 ms/iter 189.22 ms █ █
(186.59 ms … 190.44 ms) 189.71 ms ▅ ▅ ▅▅ █ █ ▅▅ ▅
( 85.42 kb … 170.25 kb) 120.77 kb █▁█▁▁██▁█▁▁▁▁█▁▁▁██▁█
5.20 ipc ( 99.82% cache) 21.26k branch misses
723.78M cycles 3.76G instructions 24.31M c-refs 42.56k c-misses
dequal 265.02 µs/iter 266.51 µs █
(257.00 µs … 439.26 µs) 324.47 µs █
( 0.00 b … 281.65 kb) 980.02 b ▅███▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.93 ipc ( 81.48% cache) 8.23k branch misses
1.02M cycles 1.97M instructions 91.95k c-refs 17.03k c-misses
lodash.isEqual 405.68 ms/iter 407.26 ms █
(387.56 ms … 423.28 ms) 418.20 ms ██
( 1.20 mb … 1.30 mb) 1.25 mb █▁█▁▁▁▁▁██▁▁██▁▁▁█▁▁█
4.57 ipc ( 99.55% cache) 22.99k branch misses
1.57G cycles 7.18G instructions 16.10M c-refs 71.90k c-misses
node.isDeepStrictEqual 245.33 µs/iter 246.61 µs █
(229.23 µs … 407.72 µs) 317.51 µs █▇▄▂
(256.00 b … 288.37 kb) 1.13 kb ██████▂▂▁▂▁▁▂▃▃▃▂▂▁▁▁
1.91 ipc ( 82.65% cache) 8.24k branch misses
957.38k cycles 1.83M instructions 92.10k c-refs 15.98k c-misses
summary
object-equals
1.05x faster than node.isDeepStrictEqual
1.13x faster than dequal
1.33x faster than are-deeply-equal
804.76x faster than fast-equals
1733.39x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 137.55 ns | 3.47 µs | 52.11 µs | 314.87 µs | 1.00x (baseline) |
dequal | 146.11 ns | 3.78 µs | 57.90 µs | 316.53 µs | 1.06x-1.01x slower |
are-deeply-equal | 241.06 ns | 5.09 µs | 66.43 µs | 389.94 µs | 1.75x-1.24x slower |
node.isDeepStrictEqual | 610.50 ns | 4.03 µs | 52.24 µs | 325.85 µs | 4.44x-1.03x slower |
fast-equals | 1.03 µs | 591.48 µs | 45.19 ms | 703.20 ms | 7.48x-2233.34x slower |
lodash.isEqual | 4.34 µs | 1.02 ms | 67.46 ms | 1.17 s | 31.54x-3715.51x slower |
Full benchmark results with hardware counters
clk: ~3.67 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Shuffled Set with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 137.55 ns/iter 137.00 ns █
(132.94 ns … 343.52 ns) 183.95 ns █▂
( 0.04 b … 700.28 b) 2.97 b ▆██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.29 ipc ( 91.24% cache) 0.02 branch misses
532.40 cycles 2.28k instructions 0.25 c-refs 0.02 c-misses
are-deeply-equal 241.06 ns/iter 237.09 ns █
(231.41 ns … 412.15 ns) 304.69 ns █
(845.56 b … 2.77 kb) 1.00 kb ▄█▄▂▂▁▁▂▂▁▁▁▁▂▂▁▁▁▁▁▁
3.43 ipc ( 96.49% cache) 0.04 branch misses
927.52 cycles 3.18k instructions 33.82 c-refs 1.19 c-misses
fast-equals 1.03 µs/iter 1.05 µs █
(955.34 ns … 1.15 µs) 1.10 µs ██▇▃
(114.78 b … 1.98 kb) 133.63 b ▅▂▅▄▃▄▂▂▅▄█████▆▄▂▂▂▂
3.85 ipc ( 94.04% cache) 4.40 branch misses
3.99k cycles 15.35k instructions 5.19 c-refs 0.31 c-misses
dequal 146.11 ns/iter 145.44 ns █
(139.13 ns … 352.17 ns) 177.66 ns ▇█
( 0.09 b … 707.46 b) 2.35 b ▂▄██▆▅▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.32 ipc ( 90.98% cache) 0.01 branch misses
562.87 cycles 2.43k instructions 0.18 c-refs 0.02 c-misses
lodash.isEqual 4.34 µs/iter 4.24 µs ▂█
(4.08 µs … 236.00 µs) 7.42 µs ██
( 64.00 b … 801.98 kb) 3.45 kb ██▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.50 ipc ( 98.53% cache) 45.04 branch misses
18.05k cycles 45.14k instructions 1.98k c-refs 29.11 c-misses
node.isDeepStrictEqual 610.50 ns/iter 620.00 ns ▄█ █
(550.00 ns … 90.63 µs) 770.00 ns ██ ██▅
(632.00 b … 669.02 kb) 654.45 b ▁▇██████▄▁▁▁▁▁▂▃▂▁▁▁▁
1.78 ipc ( 99.81% cache) 30.08 branch misses
3.85k cycles 6.86k instructions 525.57 c-refs 1.02 c-misses
summary
object-equals
1.06x faster than dequal
1.75x faster than are-deeply-equal
4.44x faster than node.isDeepStrictEqual
7.48x faster than fast-equals
31.54x faster than lodash.isEqual
• Shuffled Set with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 3.47 µs/iter 3.52 µs █ █
(3.43 µs … 3.56 µs) 3.56 µs ▆█▃█ ▃
( 0.10 b … 0.53 b) 0.11 b ████▁▄▁▄▁▄▁▄▄▁█▄██▁▁▆
3.88 ipc ( 99.97% cache) 10.91 branch misses
14.23k cycles 55.26k instructions 1.05k c-refs 0.27 c-misses
are-deeply-equal 5.09 µs/iter 5.17 µs ▂ ▂ █ █ ▂
(4.91 µs … 5.52 µs) 5.35 µs █ █ █▅ █ █▅ ▅
( 5.53 kb … 5.68 kb) 5.67 kb █▇▇█▇▇██▁▇█▁██▁▇▁▁▁▁█
3.50 ipc ( 98.33% cache) 16.98 branch misses
19.39k cycles 67.89k instructions 1.66k c-refs 27.72 c-misses
fast-equals 591.48 µs/iter 595.37 µs █
(574.05 µs … 865.66 µs) 630.94 µs ▆▆▇▄▆█▄
( 3.10 kb … 5.55 kb) 3.11 kb ▃▇████████▅▃▃▂▂▂▁▁▁▁▁
3.52 ipc ( 99.24% cache) 13.58k branch misses
2.28M cycles 8.03M instructions 9.55k c-refs 72.21 c-misses
dequal 3.78 µs/iter 3.78 µs ███▄
(3.68 µs … 4.18 µs) 4.05 µs ██████
( 0.09 b … 0.41 b) 0.10 b ███████▁▁▅▅▅▁▁▁█▅▅▁▁▅
4.13 ipc ( 99.93% cache) 10.10 branch misses
15.32k cycles 63.36k instructions 363.63 c-refs 0.26 c-misses
lodash.isEqual 1.02 ms/iter 991.00 µs █
(893.30 µs … 1.72 ms) 1.68 ms █▅
( 32.13 kb … 0.99 mb) 37.73 kb ██▇▅▂▂▁▁▂▁▁▁▁▁▁▁▂▄▂▁▂
2.86 ipc ( 91.42% cache) 24.81k branch misses
4.17M cycles 11.91M instructions 16.92k c-refs 1.45k c-misses
node.isDeepStrictEqual 4.03 µs/iter 4.04 µs █ ▅
(3.93 µs … 4.42 µs) 4.31 µs █▂ █▇▇▅
(247.83 b … 256.86 b) 255.78 b ██▁████▄▁▄▁▁▁▁▄▁▇▁▁▁▄
3.91 ipc ( 99.88% cache) 4.51 branch misses
15.41k cycles 60.29k instructions 1.54k c-refs 1.89 c-misses
summary
object-equals
1.09x faster than dequal
1.16x faster than node.isDeepStrictEqual
1.47x faster than are-deeply-equal
170.38x faster than fast-equals
293.8x faster than lodash.isEqual
• Shuffled Set with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 52.11 µs/iter 51.17 µs █
(49.14 µs … 207.70 µs) 85.09 µs █
(376.00 b … 433.25 kb) 2.47 kb ▇█▃▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.05 ipc ( 94.84% cache) 1.97k branch misses
213.99k cycles 438.09k instructions 34.42k c-refs 1.77k c-misses
are-deeply-equal 66.43 µs/iter 66.65 µs ▇█
(60.13 µs … 323.63 µs) 117.55 µs ██▅
( 27.37 kb … 770.76 kb) 172.61 kb ███▅▃▂▆▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.09 ipc ( 93.57% cache) 2.10k branch misses
262.04k cycles 547.41k instructions 41.17k c-refs 2.65k c-misses
fast-equals 45.19 ms/iter 45.42 ms █
(44.30 ms … 45.53 ms) 45.50 ms █ █
( 21.95 kb … 4.70 mb) 322.29 kb █▁▁▁▁▁▁▁▁█▁▁▁▁████▁██
3.23 ipc ( 98.16% cache) 1.59M branch misses
173.75M cycles 561.28M instructions 4.24M c-refs 77.86k c-misses
dequal 57.90 µs/iter 58.78 µs ▅█
(54.46 µs … 266.37 µs) 86.18 µs ██ ▄
(360.00 b … 339.31 kb) 1.27 kb ████▄▂▃▂▁▂▁▁▁▁▁▁▁▁▁▁▁
2.16 ipc ( 97.28% cache) 2.29k branch misses
234.01k cycles 504.78k instructions 32.41k c-refs 883.17 c-misses
lodash.isEqual 67.46 ms/iter 66.55 ms █
(66.23 ms … 78.16 ms) 66.95 ms █ ▅▅▅▅▅▅▅ ▅ ▅
(293.43 kb … 349.08 kb) 305.69 kb █▁▁███████▁▁▁▁▁▁▁█▁▁█
2.74 ipc ( 96.46% cache) 2.14M branch misses
274.78M cycles 753.82M instructions 4.07M c-refs 144.27k c-misses
node.isDeepStrictEqual 52.24 µs/iter 52.13 µs ██
(49.11 µs … 325.64 µs) 70.33 µs ██▂
(632.00 b … 493.32 kb) 1.45 kb ▄███▄▃▃▃▃▂▁▁▁▁▁▁▁▁▁▁▁
2.19 ipc ( 95.74% cache) 2.03k branch misses
213.36k cycles 468.00k instructions 33.12k c-refs 1.41k c-misses
summary
object-equals
1x faster than node.isDeepStrictEqual
1.11x faster than dequal
1.27x faster than are-deeply-equal
867.19x faster than fast-equals
1294.64x faster than lodash.isEqual
• Shuffled Set with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 314.87 µs/iter 321.48 µs █
(299.38 µs … 506.24 µs) 401.25 µs █▄
( 0.00 b … 512.17 kb) 1.01 kb ███▃▆▆▅▁▁▁▁▁▁▁▁▂▁▁▁▁▁
1.35 ipc ( 72.44% cache) 14.26k branch misses
1.25M cycles 1.70M instructions 122.50k c-refs 33.76k c-misses
are-deeply-equal 389.94 µs/iter 392.92 µs █▂
(360.79 µs … 637.67 µs) 524.90 µs ▂ ██
( 35.38 kb … 1.01 mb) 683.24 kb ▇████▃▂▁▂▁▂▂▂▁▁▁▁▁▁▁▁
1.40 ipc ( 73.28% cache) 14.64k branch misses
1.52M cycles 2.13M instructions 140.56k c-refs 37.56k c-misses
fast-equals 703.20 ms/iter 710.66 ms █ █
(688.06 ms … 717.25 ms) 713.19 ms ▅ ▅ ▅ █▅ █ ▅▅▅
( 85.42 kb … 170.25 kb) 120.77 kb █▁▁▁█▁▁█▁██▁▁█▁▁▁▁███
2.88 ipc ( 86.24% cache) 32.39M branch misses
2.87G cycles 8.25G instructions 93.21M c-refs 12.82M c-misses
dequal 316.53 µs/iter 316.78 µs █
(308.09 µs … 735.12 µs) 406.62 µs ▆█▆
( 0.00 b … 256.11 kb) 0.98 kb ███▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.51 ipc ( 73.91% cache) 14.05k branch misses
1.30M cycles 1.96M instructions 115.42k c-refs 30.11k c-misses
lodash.isEqual 1.17 s/iter 1.19 s ██
(1.13 s … 1.26 s) 1.21 s ▅██ ▅ ▅▅ ▅▅ ▅
( 1.20 mb … 1.31 mb) 1.25 mb ███▁█▁▁▁▁▁▁██▁▁▁██▁▁█
2.57 ipc ( 82.86% cache) 37.46M branch misses
4.64G cycles 11.94G instructions 96.90M c-refs 16.61M c-misses
node.isDeepStrictEqual 325.85 µs/iter 327.00 µs █
(318.43 µs … 491.37 µs) 385.22 µs █
(256.00 b … 320.38 kb) 1.37 kb ███▆▅▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.45 ipc ( 72.97% cache) 14.34k branch misses
1.26M cycles 1.83M instructions 118.49k c-refs 32.03k c-misses
summary
object-equals
1.01x faster than dequal
1.03x faster than node.isDeepStrictEqual
1.24x faster than are-deeply-equal
2233.34x faster than fast-equals
3715.51x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 5.27 µs | 231.10 µs | 1.96 ms | 10.50 ms | 1.00x (baseline) |
are-deeply-equal | 9.32 µs | 321.39 µs | 3.46 ms | 17.71 ms | 1.77x-1.69x slower |
fast-equals | 9.80 µs | 519.93 µs | 17.78 ms | 247.68 ms | 1.86x-23.59x slower |
node.isDeepStrictEqual | 12.17 µs | 386.77 µs | 3.29 ms | 18.81 ms | 2.31x-1.79x slower |
lodash.isEqual | 74.81 µs | 2.92 ms | 55.57 ms | 620.38 ms | 14.20x-59.08x slower |
Full benchmark results with hardware counters
clk: ~3.68 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Nested Set with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 5.27 µs/iter 5.30 µs ▂ ▂ █
(5.19 µs … 5.37 µs) 5.32 µs ▅ █▅█▅▅ ▅▅ █
( 3.38 kb … 8.18 kb) 3.57 kb █▁▁▁▇▁▁█████▇▇██▁▇▇▇█
3.02 ipc ( 99.01% cache) 36.97 branch misses
21.63k cycles 65.24k instructions 731.78 c-refs 7.21 c-misses
are-deeply-equal 9.32 µs/iter 9.44 µs █
(9.11 µs … 9.54 µs) 9.50 µs █ █
( 5.50 kb … 8.36 kb) 5.73 kb ██▁█▁▁█████▁█▁▁▁▁█▁▁█
2.88 ipc ( 97.14% cache) 51.68 branch misses
35.37k cycles 101.70k instructions 1.56k c-refs 44.58 c-misses
fast-equals 9.80 µs/iter 9.82 µs █
(9.11 µs … 83.63 µs) 14.98 µs ▂█
(576.00 b … 271.23 kb) 3.04 kb ███▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.42 ipc ( 99.29% cache) 72.98 branch misses
39.84k cycles 176.01k instructions 868.36 c-refs 6.13 c-misses
lodash.isEqual 74.81 µs/iter 74.77 µs █
(68.91 µs … 526.03 µs) 110.11 µs █
( 5.45 kb … 913.50 kb) 58.11 kb ▄█▅▆▂▂▂▁▁▃▁▁▁▁▁▁▁▁▁▁▁
2.69 ipc ( 98.80% cache) 498.06 branch misses
298.79k cycles 803.94k instructions 29.16k c-refs 349.18 c-misses
node.isDeepStrictEqual 12.17 µs/iter 12.03 µs ▂ █▂
(10.72 µs … 229.63 µs) 17.63 µs ████
( 2.20 kb … 906.29 kb) 6.82 kb ▂████▂▂▂▂▅▅▂▂▁▁▂▁▁▁▁▁
2.56 ipc ( 99.04% cache) 91.98 branch misses
48.33k cycles 123.85k instructions 1.85k c-refs 17.66 c-misses
summary
object-equals
1.77x faster than are-deeply-equal
1.86x faster than fast-equals
2.31x faster than node.isDeepStrictEqual
14.2x faster than lodash.isEqual
• Nested Set with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 231.10 µs/iter 232.04 µs █
(224.02 µs … 444.48 µs) 280.02 µs █▃
( 59.31 kb … 357.70 kb) 102.55 kb ▄██▇▅▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.32 ipc ( 76.37% cache) 5.09k branch misses
889.97k cycles 2.06M instructions 43.49k c-refs 10.28k c-misses
are-deeply-equal 321.39 µs/iter 324.63 µs █
(302.77 µs … 637.45 µs) 503.40 µs ▂█▄
( 42.42 kb … 990.92 kb) 672.20 kb ███▆▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.47 ipc ( 77.31% cache) 4.34k branch misses
1.29M cycles 3.17M instructions 72.98k c-refs 16.56k c-misses
fast-equals 519.93 µs/iter 520.63 µs ▃█
(508.00 µs … 743.46 µs) 592.56 µs ███
( 78.07 kb … 80.19 kb) 78.11 kb ▃████▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
4.78 ipc ( 94.72% cache) 2.12k branch misses
2.11M cycles 10.07M instructions 42.67k c-refs 2.25k c-misses
lodash.isEqual 2.92 ms/iter 2.90 ms █
(2.72 ms … 5.13 ms) 4.19 ms █▇
( 1.32 mb … 2.10 mb) 1.70 mb ██▄▃▃▂▂▂▂▁▂▂▁▁▁▁▁▂▁▁▁
2.94 ipc ( 98.71% cache) 14.53k branch misses
11.55M cycles 33.94M instructions 926.10k c-refs 11.95k c-misses
node.isDeepStrictEqual 386.77 µs/iter 386.68 µs █
(376.14 µs … 610.29 µs) 459.37 µs ██
( 42.41 kb … 537.70 kb) 186.25 kb ▃██▇▅▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.41 ipc ( 87.14% cache) 5.31k branch misses
1.58M cycles 3.81M instructions 50.02k c-refs 6.43k c-misses
summary
object-equals
1.39x faster than are-deeply-equal
1.67x faster than node.isDeepStrictEqual
2.25x faster than fast-equals
12.64x faster than lodash.isEqual
• Nested Set with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 1.96 ms/iter 2.04 ms █▄
(1.79 ms … 2.85 ms) 2.75 ms ██
(832.01 kb … 841.77 kb) 832.60 kb ██▇█▆▄▄▄▂▃▂▂▃▁▃▁▂▂▁▁▂
2.14 ipc ( 74.89% cache) 44.07k branch misses
7.73M cycles 16.53M instructions 353.60k c-refs 88.80k c-misses
are-deeply-equal 3.46 ms/iter 3.65 ms █▄▅▃
(3.09 ms … 4.44 ms) 4.29 ms ████▂▂▂▂▂▂▂
( 5.14 mb … 5.34 mb) 5.25 mb ▇███████████▅▅▄▂▄▄▃▃▃
1.89 ipc ( 83.46% cache) 40.23k branch misses
13.42M cycles 25.30M instructions 599.84k c-refs 99.20k c-misses
fast-equals 17.78 ms/iter 18.14 ms █
(16.46 ms … 21.44 ms) 21.11 ms █
(624.15 kb … 636.55 kb) 625.44 kb █▆▁▃█▄▁▆▃█▃▁▁▁▁▃▁▁▁▁▃
5.08 ipc ( 98.97% cache) 13.23k branch misses
67.01M cycles 340.72M instructions 1.98M c-refs 20.32k c-misses
lodash.isEqual 55.57 ms/iter 55.71 ms █
(55.05 ms … 56.68 ms) 56.22 ms ▅ █▅ ▅ ▅ ▅ ▅
( 13.62 mb … 13.72 mb) 13.64 mb █▁██▁▁█▁█▁▁█▁▁▁▁▁▁▁▁█
3.53 ipc ( 98.47% cache) 130.32k branch misses
216.33M cycles 764.30M instructions 8.49M c-refs 129.47k c-misses
node.isDeepStrictEqual 3.29 ms/iter 3.31 ms ██▃
(3.18 ms … 3.79 ms) 3.72 ms ███▆▃
( 1.46 mb … 1.46 mb) 1.46 mb ▇█████▆▅▃▃▄▂▁▂▂▂▂▂▁▁▂
2.28 ipc ( 84.39% cache) 49.64k branch misses
13.43M cycles 30.58M instructions 425.79k c-refs 66.48k c-misses
summary
object-equals
1.67x faster than node.isDeepStrictEqual
1.76x faster than are-deeply-equal
9.05x faster than fast-equals
28.28x faster than lodash.isEqual
• Nested Set with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 10.50 ms/iter 10.83 ms █
(10.05 ms … 11.62 ms) 11.62 ms ██
( 3.23 mb … 3.26 mb) 3.25 mb ▄██▆▅▂▄▂▅▄▄▆▁▆▄▂▂▁▁▂▂
1.59 ipc ( 85.08% cache) 177.43k branch misses
41.31M cycles 65.70M instructions 1.38M c-refs 206.32k c-misses
are-deeply-equal 17.71 ms/iter 18.00 ms █ █
(17.27 ms … 18.45 ms) 18.40 ms █ ██ ▅ ▅
( 20.97 mb … 21.07 mb) 21.03 mb ███▅██▅▁▁▅█▁▁█▁▁▅█▅▅▅
1.58 ipc ( 82.10% cache) 164.29k branch misses
64.26M cycles 101.45M instructions 2.62M c-refs 469.32k c-misses
fast-equals 247.68 ms/iter 252.50 ms █ █
(237.70 ms … 263.85 ms) 255.68 ms █▅▅▅ ▅▅▅▅ █
( 2.44 mb … 2.50 mb) 2.49 mb ████▁▁▁▁▁▁▁▁▁████▁▁▁█
5.10 ipc ( 98.83% cache) 68.08k branch misses
967.42M cycles 4.93G instructions 33.90M c-refs 395.72k c-misses
lodash.isEqual 620.38 ms/iter 626.79 ms █ █
(591.63 ms … 673.98 ms) 633.55 ms ▅ ▅ ▅ ▅▅ ▅█ █ ▅
( 54.52 mb … 54.55 mb) 54.54 mb █▁█▁▁▁█▁▁▁██▁██▁▁█▁▁█
4.02 ipc ( 98.00% cache) 524.24k branch misses
2.42G cycles 9.70G instructions 55.70M c-refs 1.11M c-misses
node.isDeepStrictEqual 18.81 ms/iter 19.16 ms ▃█ ▃
(18.08 ms … 20.30 ms) 20.05 ms ▂██ █▂▂ ▂ ▂▇ ▂
( 5.82 mb … 5.84 mb) 5.82 mb ███▁███▁▆█▆██▆▆▆▁▁▁▁█
1.66 ipc ( 75.96% cache) 197.53k branch misses
73.78M cycles 122.38M instructions 1.92M c-refs 460.78k c-misses
summary
object-equals
1.69x faster than are-deeply-equal
1.79x faster than node.isDeepStrictEqual
23.59x faster than fast-equals
59.08x faster than lodash.isEqual
Note
dequal
is excluded from the test because it returns an incorrect result. An issue has been opened on the official GitHub repository: lukeed/dequal#31.
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 5.16 µs | 266.59 µs | 2.37 ms | 12.41 ms | 1.00x (baseline) |
are-deeply-equal | 11.21 µs | 754.99 µs | 24.21 ms | 345.58 ms | 2.17x-27.85x slower |
node.isDeepStrictEqual | 11.28 µs | 422.36 µs | 3.54 ms | 18.47 ms | 2.19x-1.49x slower |
fast-equals | 20.27 µs | 1.44 ms | 48.39 ms | 795.07 ms | 3.93x-64.08x slower |
lodash.isEqual | 164.02 µs | 14.83 ms | 657.67 ms | 10.06 s | 31.80x-811.19x slower |
Full benchmark results with hardware counters
clk: ~3.69 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.2.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Shuffled nested Set with mixed primitive values [size=16]
------------------------------------------- -------------------------------
object-equals 5.16 µs/iter 5.25 µs ▄ █
(4.81 µs … 5.85 µs) 5.61 µs ██ █▅▅
( 3.38 kb … 8.54 kb) 3.58 kb ██▅▅▁▁▁▁▁███▁▁▅▁▅▁▅▅█
3.26 ipc ( 99.06% cache) 13.93 branch misses
20.06k cycles 65.34k instructions 742.26 c-refs 6.95 c-misses
are-deeply-equal 11.21 µs/iter 11.19 µs █
(10.23 µs … 232.65 µs) 16.03 µs █
( 2.48 kb … 343.46 kb) 21.66 kb ▂█▃█▅▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.68 ipc ( 98.79% cache) 88.86 branch misses
45.29k cycles 121.34k instructions 2.24k c-refs 26.96 c-misses
fast-equals 20.27 µs/iter 20.15 µs █▅
(19.66 µs … 83.54 µs) 24.84 µs ██
( 96.00 b … 227.70 kb) 3.14 kb ▃██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.50 ipc ( 99.17% cache) 287.66 branch misses
84.51k cycles 295.89k instructions 1.22k c-refs 10.18 c-misses
lodash.isEqual 164.02 µs/iter 161.89 µs █
(148.51 µs … 674.77 µs) 232.41 µs █
( 33.25 kb … 1.25 mb) 69.56 kb ▁▁█▇▃▃▁▁▁▁▁▂▂▁▁▁▁▁▁▁▁
2.50 ipc ( 99.03% cache) 1.54k branch misses
655.13k cycles 1.64M instructions 55.30k c-refs 535.23 c-misses
node.isDeepStrictEqual 11.28 µs/iter 11.35 µs █
(10.35 µs … 219.57 µs) 15.92 µs █ █▅
( 1.84 kb … 251.45 kb) 6.43 kb ▃█▂██▂▂▁▁▁▂▂▁▁▁▁▁▁▁▁▁
2.70 ipc ( 99.37% cache) 73.75 branch misses
45.70k cycles 123.30k instructions 1.87k c-refs 11.76 c-misses
summary
object-equals
2.17x faster than are-deeply-equal
2.19x faster than node.isDeepStrictEqual
3.93x faster than fast-equals
31.8x faster than lodash.isEqual
• Shuffled nested Set with mixed primitive values [size=512]
------------------------------------------- -------------------------------
object-equals 266.59 µs/iter 267.41 µs █
(259.31 µs … 479.78 µs) 333.08 µs █▄
( 21.58 kb … 389.81 kb) 102.39 kb ▅██▆▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
1.94 ipc ( 73.26% cache) 11.31k branch misses
1.03M cycles 1.99M instructions 43.41k c-refs 11.61k c-misses
are-deeply-equal 754.99 µs/iter 753.72 µs █
(735.32 µs … 993.22 µs) 904.08 µs █
(118.69 kb … 683.71 kb) 664.43 kb ▂██▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
2.25 ipc ( 82.15% cache) 24.91k branch misses
2.91M cycles 6.54M instructions 101.78k c-refs 18.17k c-misses
fast-equals 1.44 ms/iter 1.44 ms █
(1.40 ms … 1.52 ms) 1.50 ms ██
( 78.07 kb … 80.19 kb) 78.11 kb ▃▄▄▄▆███▃▂▂▂▃▂▃▄▃▄▄▂▁
2.97 ipc ( 90.99% cache) 61.34k branch misses
5.80M cycles 17.25M instructions 70.79k c-refs 6.38k c-misses
lodash.isEqual 14.83 ms/iter 14.76 ms █
(14.20 ms … 17.45 ms) 17.16 ms █
( 2.27 mb … 3.51 mb) 2.94 mb ███▅▅▁▁▄▁▂▁▁▂▂▁▄▁▁▂▁▂
2.49 ipc ( 99.10% cache) 128.46k branch misses
59.66M cycles 148.65M instructions 3.87M c-refs 34.85k c-misses
node.isDeepStrictEqual 422.36 µs/iter 423.31 µs █▄
(411.23 µs … 614.32 µs) 479.95 µs ▅██
( 42.20 kb … 569.71 kb) 186.00 kb ▃████▅▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁
2.20 ipc ( 84.56% cache) 11.82k branch misses
1.73M cycles 3.80M instructions 50.65k c-refs 7.82k c-misses
summary
object-equals
1.58x faster than node.isDeepStrictEqual
2.83x faster than are-deeply-equal
5.39x faster than fast-equals
55.64x faster than lodash.isEqual
• Shuffled nested Set with mixed primitive values [size=4096]
------------------------------------------- -------------------------------
object-equals 2.37 ms/iter 2.39 ms █
(2.26 ms … 3.27 ms) 3.07 ms ▅█
(832.01 kb … 841.77 kb) 832.60 kb ██▅▅▃▄▃▃▂▂▂▂▁▁▁▁▁▁▁▁▁
1.84 ipc ( 79.03% cache) 102.33k branch misses
8.90M cycles 16.38M instructions 360.21k c-refs 75.54k c-misses
are-deeply-equal 24.21 ms/iter 24.34 ms █ ██
(23.88 ms … 24.71 ms) 24.59 ms █ █ █ █ ██ █
( 5.17 mb … 5.22 mb) 5.21 mb ██████▁▁▁████████▁▁▁█
2.39 ipc ( 90.17% cache) 835.71k branch misses
92.57M cycles 221.18M instructions 3.64M c-refs 357.60k c-misses
fast-equals 48.39 ms/iter 48.79 ms █ █
(47.86 ms … 49.21 ms) 48.88 ms ▅ █▅ ▅ ▅ ▅ ▅ █
(624.15 kb … 636.55 kb) 625.03 kb █▁██▁▁█▁█▁█▁▁▁▁▁▁▁█▁█
3.08 ipc ( 97.85% cache) 2.05M branch misses
198.47M cycles 610.36M instructions 3.84M c-refs 82.43k c-misses
lodash.isEqual 657.67 ms/iter 670.83 ms █ █
(635.76 ms … 701.90 ms) 681.33 ms ▅█▅ ▅█ ▅ ▅ ▅▅
( 14.27 mb … 14.39 mb) 14.29 mb ███▁██▁▁▁▁▁▁▁█▁█▁▁▁██
2.58 ipc ( 99.05% cache) 4.49M branch misses
2.63G cycles 6.79G instructions 128.98M c-refs 1.23M c-misses
node.isDeepStrictEqual 3.54 ms/iter 3.56 ms █▃
(3.45 ms … 4.30 ms) 3.89 ms ██
( 1.46 mb … 1.46 mb) 1.46 mb ▅██▅█▇▅▅▂▃▂▂▁▂▃▁▁▁▂▁▁
2.11 ipc ( 82.65% cache) 102.45k branch misses
14.40M cycles 30.46M instructions 430.84k c-refs 74.77k c-misses
summary
object-equals
1.49x faster than node.isDeepStrictEqual
10.22x faster than are-deeply-equal
20.43x faster than fast-equals
277.64x faster than lodash.isEqual
• Shuffled nested Set with mixed primitive values [size=16386]
------------------------------------------- -------------------------------
object-equals 12.41 ms/iter 12.47 ms █ ▄▄▄
(12.21 ms … 12.73 ms) 12.71 ms ███▅ ████ ▅
( 3.23 mb … 3.26 mb) 3.25 mb ▅█████▅████▁███▅▅▁▅▅▅
1.31 ipc ( 81.00% cache) 440.70k branch misses
50.74M cycles 66.23M instructions 1.54M c-refs 291.75k c-misses
are-deeply-equal 345.58 ms/iter 354.02 ms █
(336.31 ms … 356.82 ms) 356.20 ms ██
( 20.78 mb … 20.88 mb) 20.81 mb ███▁▁▁▁▁▁▁▁▁█▁▁▁▁████
2.29 ipc ( 84.94% cache) 15.16M branch misses
1.37G cycles 3.14G instructions 58.21M c-refs 8.77M c-misses
fast-equals 795.07 ms/iter 814.29 ms █ █
(764.57 ms … 824.97 ms) 821.71 ms ▅ █▅ ▅ ▅ █ ▅ ▅▅
( 2.44 mb … 2.50 mb) 2.49 mb █▁██▁█▁▁█▁▁▁▁▁▁█▁█▁██
2.87 ipc ( 85.00% cache) 35.48M branch misses
3.13G cycles 8.98G instructions 109.42M c-refs 16.41M c-misses
lodash.isEqual 10.06 s/iter 10.07 s █
(9.82 s … 11.12 s) 10.29 s █ █
( 56.16 mb … 56.34 mb) 56.25 mb ███▁▁██▁▁▁▁█▁▁▁▁█▁▁▁█
2.57 ipc ( 98.52% cache) 65.98M branch misses
40.46G cycles 103.93G instructions 2.11G c-refs 31.28M c-misses
node.isDeepStrictEqual 18.47 ms/iter 18.52 ms █
(18.31 ms … 18.82 ms) 18.78 ms ▅ ██ ▅ ▅
( 5.82 mb … 5.84 mb) 5.82 mb █████▅████▁▁▁▅▅▅▅▅▁▁▅
1.61 ipc ( 76.22% cache) 389.73k branch misses
75.48M cycles 121.31M instructions 1.88M c-refs 448.25k c-misses
summary
object-equals
1.49x faster than node.isDeepStrictEqual
27.85x faster than are-deeply-equal
64.08x faster than fast-equals
811.19x faster than lodash.isEqual
Note
dequal
is excluded from the test because it returns an incorrect result. An issue has been opened on the official GitHub repository: lukeed/dequal#31.
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 50.61 ns | 162.56 ns | 179.35 ns | 334.22 ns | 1.00x (baseline) |
dequal | 54.22 ns | 397.93 ns | 3.03 µs | 11.83 µs | 1.07x-35.39x slower |
are-deeply-equal | 89.08 ns | 396.00 ns | 2.41 µs | 9.87 µs | 1.76x-29.54x slower |
node.isDeepStrictEqual | 770.16 ns | 536.87 ns | 577.67 ns | 846.07 ns | 15.22x-2.53x slower |
lodash.isEqual | 3.81 µs | 5.16 µs | 16.59 µs | 56.45 µs | 75.34x-168.90x slower |
Full benchmark results with hardware counters
clk: ~3.81 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.2.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Array Buffer [size=16]
------------------------------------------- -------------------------------
object-equals 50.61 ns/iter 50.01 ns ▆█
(47.62 ns … 144.32 ns) 94.39 ns ██
( 50.38 b … 274.81 b) 208.15 b ██▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.87 ipc ( 96.56% cache) 0.01 branch misses
205.63 cycles 795.05 instructions 6.87 c-refs 0.24 c-misses
are-deeply-equal 89.08 ns/iter 87.98 ns █
(83.81 ns … 195.85 ns) 134.25 ns ▂█▂
(215.25 b … 520.28 b) 392.20 b ███▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.72 ipc ( 96.49% cache) 0.02 branch misses
362.41 cycles 1.35k instructions 12.95 c-refs 0.45 c-misses
dequal 54.22 ns/iter 53.78 ns █
(47.33 ns … 161.67 ns) 96.43 ns ▆█
( 90.16 b … 271.12 b) 208.19 b ▁███▂▂▃▃▁▁▁▁▁▁▁▁▁▁▁▁▁
3.87 ipc ( 96.63% cache) 0.01 branch misses
213.68 cycles 827.43 instructions 6.88 c-refs 0.23 c-misses
lodash.isEqual 3.81 µs/iter 3.83 µs ▄ █
(3.75 µs … 4.07 µs) 3.89 µs ▅█ ▅█ █
( 1.23 kb … 1.26 kb) 1.24 kb █████▅██▁▁██▅▅█▁█▁█▅▅
2.37 ipc ( 99.71% cache) 17.49 branch misses
14.74k cycles 34.87k instructions 1.65k c-refs 4.74 c-misses
node.isDeepStrictEqual 770.16 ns/iter 770.00 ns █
(670.00 ns … 67.56 µs) 1.01 µs █
(920.00 b … 232.86 kb) 934.48 b ▁▂▃▃███▁▂▁▁▁▁▁▂▁▁▁▁▁▁
1.42 ipc ( 99.70% cache) 30.15 branch misses
4.38k cycles 6.22k instructions 831.38 c-refs 2.51 c-misses
summary
object-equals
1.07x faster than dequal
1.76x faster than are-deeply-equal
15.22x faster than node.isDeepStrictEqual
75.34x faster than lodash.isEqual
• Array Buffer [size=512]
------------------------------------------- -------------------------------
object-equals 162.56 ns/iter 160.16 ns █
(153.11 ns … 366.40 ns) 241.00 ns █
(240.59 b … 573.70 b) 416.18 b ▃██▂▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁
2.99 ipc ( 96.09% cache) 0.02 branch misses
623.10 cycles 1.86k instructions 14.07 c-refs 0.55 c-misses
are-deeply-equal 396.00 ns/iter 395.57 ns █▂
(377.43 ns … 461.29 ns) 444.93 ns ██
(241.92 b … 502.29 b) 391.95 b ▂▂▄▄██▄▂▁▂▃▃▂▁▂▂▁▁▁▂▁
5.36 ipc ( 95.95% cache) 1.02 branch misses
1.52k cycles 8.17k instructions 13.24 c-refs 0.54 c-misses
dequal 397.93 ns/iter 396.77 ns █
(390.16 ns … 466.69 ns) 442.49 ns █▅
( 41.97 b … 364.64 b) 208.10 b ▆██▄▂▁▂▄▂▁▁▁▂▁▁▁▁▁▁▁▁
5.35 ipc ( 96.03% cache) 1.02 branch misses
1.62k cycles 8.64k instructions 7.06 c-refs 0.28 c-misses
lodash.isEqual 5.16 µs/iter 5.17 µs █ ████
(5.09 µs … 5.34 µs) 5.31 µs █ ▅████
( 1.23 kb … 1.28 kb) 1.24 kb ▇▁█▇█████▇▁▇▇▁▇▁▁▁▁▁▇
2.96 ipc ( 99.68% cache) 19.53 branch misses
21.20k cycles 62.67k instructions 1.77k c-refs 5.58 c-misses
node.isDeepStrictEqual 536.87 ns/iter 544.09 ns ▄█
(512.09 ns … 621.92 ns) 598.80 ns ██████▇
(209.22 b … 723.38 b) 544.11 b ▅█████████▅▅▅▅▃▂▂▂▂▁▂
2.37 ipc ( 99.46% cache) 0.11 branch misses
2.19k cycles 5.19k instructions 183.14 c-refs 0.99 c-misses
summary
object-equals
2.44x faster than are-deeply-equal
2.45x faster than dequal
3.3x faster than node.isDeepStrictEqual
31.77x faster than lodash.isEqual
• Array Buffer [size=4096]
------------------------------------------- -------------------------------
object-equals 179.35 ns/iter 177.85 ns █
(171.94 ns … 270.65 ns) 235.60 ns █
(298.28 b … 528.22 b) 416.17 b ▅██▃▂▁▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁
3.21 ipc ( 95.72% cache) 0.02 branch misses
724.22 cycles 2.32k instructions 14.35 c-refs 0.61 c-misses
are-deeply-equal 2.41 µs/iter 2.40 µs █
(2.35 µs … 2.72 µs) 2.70 µs █▅
(334.53 b … 392.23 b) 391.20 b ███▆▃▁▂▁▂▁▂▁▃▁▄▁▁▁▂▁▂
5.95 ipc ( 94.92% cache) 1.04 branch misses
9.66k cycles 57.47k instructions 15.45 c-refs 0.79 c-misses
dequal 3.03 µs/iter 2.99 µs █
(2.97 µs … 3.49 µs) 3.40 µs ██
(199.49 b … 208.45 b) 207.88 b ██▂▁▁▃▂▁▁▃▂▂▁▁▁▁▂▁▁▁▂
5.62 ipc ( 94.12% cache) 1.04 branch misses
11.59k cycles 65.11k instructions 8.79 c-refs 0.52 c-misses
lodash.isEqual 16.59 µs/iter 16.83 µs █▂▅
(15.65 µs … 138.85 µs) 22.32 µs ▄████
( 1.59 kb … 336.98 kb) 1.79 kb █████▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.96 ipc ( 98.83% cache) 46.93 branch misses
66.49k cycles 263.18k instructions 2.71k c-refs 31.79 c-misses
node.isDeepStrictEqual 577.67 ns/iter 580.77 ns █▅
(564.35 ns … 635.44 ns) 626.66 ns ▇███
(233.22 b … 723.19 b) 544.11 b ▄██████▆▄▂▂▁▁▁▂▁▂▁▂▂▂
2.40 ipc ( 99.52% cache) 0.10 branch misses
2.36k cycles 5.66k instructions 222.78 c-refs 1.08 c-misses
summary
object-equals
3.22x faster than node.isDeepStrictEqual
13.45x faster than are-deeply-equal
16.87x faster than dequal
92.49x faster than lodash.isEqual
• Array Buffer [size=16386]
------------------------------------------- -------------------------------
object-equals 334.22 ns/iter 330.21 ns █
(320.44 ns … 422.88 ns) 405.83 ns █▂
(277.36 b … 534.60 b) 416.10 b ▅██▃▂▂▂▂▁▁▁▁▂▂▂▁▁▁▁▁▂
2.98 ipc ( 99.82% cache) 1.02 branch misses
1.33k cycles 3.96k instructions 556.04 c-refs 1.02 c-misses
are-deeply-equal 9.87 µs/iter 9.80 µs █▃
(9.75 µs … 10.36 µs) 10.35 µs ██▂
(386.95 b … 392.54 b) 391.93 b ███▁▁▁▁▁▁▁▆▁▁▁▁▁▁▁▁▁▆
6.05 ipc ( 99.63% cache) 1.09 branch misses
37.47k cycles 226.52k instructions 499.97 c-refs 1.83 c-misses
dequal 11.83 µs/iter 11.82 µs █
(11.80 µs … 11.90 µs) 11.88 µs █ █
(208.14 b … 208.16 b) 208.15 b █▁██▁██▁▁▁▁▁▁▁▁▁▁▁█▁█
5.66 ipc ( 99.68% cache) 1.13 branch misses
45.74k cycles 258.74k instructions 428.20 c-refs 1.37 c-misses
lodash.isEqual 56.45 µs/iter 55.14 µs █
(51.72 µs … 194.31 µs) 72.68 µs █
( 1.59 kb … 566.70 kb) 2.28 kb ▁▂▁█▂▁▁▂▁▁▁▁▁▂▂▁▁▁▁▁▁
4.42 ipc ( 98.48% cache) 54.54 branch misses
216.25k cycles 955.30k instructions 3.29k c-refs 49.92 c-misses
node.isDeepStrictEqual 846.07 ns/iter 849.97 ns ██
(795.04 ns … 902.55 ns) 901.10 ns ██▂
(322.75 b … 756.89 b) 544.09 b ▁▃▃▂▃▃▃▅████▂▁▂▁▂▅▃▁▂
2.22 ipc ( 99.78% cache) 1.10 branch misses
3.29k cycles 7.30k instructions 889.97 c-refs 1.97 c-misses
summary
object-equals
2.53x faster than node.isDeepStrictEqual
29.54x faster than are-deeply-equal
35.39x faster than dequal
168.9x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 49.26 ns | 172.12 ns | 698.99 ns | 2.57 µs | 1.00x (baseline) |
dequal | 52.80 ns | 407.28 ns | 3.02 µs | 11.90 µs | 1.07x-4.64x slower |
are-deeply-equal | 93.65 ns | 379.90 ns | 2.46 µs | 9.85 µs | 1.90x-3.84x slower |
lodash.isEqual | 3.88 µs | 5.17 µs | 17.07 µs | 54.68 µs | 78.83x-21.31x slower |
Full benchmark results with hardware counters
clk: ~3.66 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.2.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Array Buffer (web-safe) [size=16]
------------------------------------------- -------------------------------
object-equals 49.26 ns/iter 48.46 ns █▂
(46.20 ns … 133.12 ns) 94.15 ns ██
( 50.38 b … 290.26 b) 208.15 b ██▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.96 ipc ( 96.59% cache) 0.01 branch misses
200.66 cycles 794.17 instructions 6.87 c-refs 0.23 c-misses
are-deeply-equal 93.65 ns/iter 92.44 ns █
(87.27 ns … 200.32 ns) 141.24 ns █▃
(215.24 b … 520.28 b) 392.20 b ▆██▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▂▁
3.56 ipc ( 96.31% cache) 0.02 branch misses
380.62 cycles 1.36k instructions 13.00 c-refs 0.48 c-misses
dequal 52.80 ns/iter 53.90 ns █
(46.69 ns … 134.28 ns) 97.27 ns ▂█▃
( 2.54 b … 272.39 b) 208.12 b ███▃▅▆▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁
4.08 ipc ( 96.54% cache) 0.01 branch misses
199.47 cycles 814.05 instructions 6.87 c-refs 0.24 c-misses
lodash.isEqual 3.88 µs/iter 3.91 µs ▂█
(3.81 µs … 4.08 µs) 4.06 µs ▂▅ ██ ▅ ▂
( 1.23 kb … 1.26 kb) 1.24 kb ██▇██▄▇▄█▁█▇▄▁▁▄▁▄▁▁▄
2.33 ipc ( 99.68% cache) 17.89 branch misses
15.02k cycles 34.94k instructions 1.64k c-refs 5.19 c-misses
summary
object-equals
1.07x faster than dequal
1.9x faster than are-deeply-equal
78.83x faster than lodash.isEqual
• Array Buffer (web-safe) [size=512]
------------------------------------------- -------------------------------
object-equals 172.12 ns/iter 171.82 ns █
(157.16 ns … 634.66 ns) 226.32 ns ▆█
(201.71 b … 633.35 b) 416.18 b ▂▇▇██▆▃▂▁▁▁▁▁▁▁▁▁▁▂▁▁
4.60 ipc ( 96.34% cache) 0.02 branch misses
674.29 cycles 3.10k instructions 13.91 c-refs 0.51 c-misses
are-deeply-equal 379.90 ns/iter 377.90 ns █
(370.74 ns … 581.11 ns) 431.17 ns █▆
(241.92 b … 531.67 b) 392.18 b ▃██▅▂▁▁▂▂▂▁▁▁▁▁▁▁▂▂▁▁
5.33 ipc ( 96.04% cache) 1.02 branch misses
1.53k cycles 8.17k instructions 13.23 c-refs 0.52 c-misses
dequal 407.28 ns/iter 412.99 ns █▃
(391.28 ns … 523.69 ns) 492.61 ns ██
(202.35 b … 347.34 b) 208.81 b ██▅▅▆▆▂▂▃▂▂▂▂▂▂▂▂▁▁▂▁
5.37 ipc ( 95.68% cache) 1.02 branch misses
1.61k cycles 8.63k instructions 7.12 c-refs 0.31 c-misses
lodash.isEqual 5.17 µs/iter 5.18 µs █
(5.03 µs … 5.70 µs) 5.69 µs ▇█▇
( 1.23 kb … 1.28 kb) 1.24 kb ███▄▇▇▇▁▄▁▁▁▁▁▁▄▁▁▄▁▄
3.00 ipc ( 99.64% cache) 17.80 branch misses
20.88k cycles 62.69k instructions 1.70k c-refs 6.11 c-misses
summary
object-equals
2.21x faster than are-deeply-equal
2.37x faster than dequal
30.07x faster than lodash.isEqual
• Array Buffer (web-safe) [size=4096]
------------------------------------------- -------------------------------
object-equals 698.99 ns/iter 693.81 ns █
(665.42 ns … 889.69 ns) 851.31 ns █
(293.31 b … 529.60 b) 416.13 b ██▇▅▂▂▂▁▁▂▂▂▁▂▂▂▁▂▁▂▂
5.58 ipc ( 95.28% cache) 1.04 branch misses
2.76k cycles 15.41k instructions 17.03 c-refs 0.80 c-misses
are-deeply-equal 2.46 µs/iter 2.43 µs █▅
(2.37 µs … 2.86 µs) 2.81 µs ██▆
(383.32 b … 392.54 b) 392.01 b ███▄▁▂▁▁▁▂▂▂▁▃▄▁▂▃▁▂▂
5.92 ipc ( 93.81% cache) 1.07 branch misses
9.72k cycles 57.47k instructions 17.08 c-refs 1.06 c-misses
dequal 3.02 µs/iter 3.07 µs █
(2.84 µs … 3.32 µs) 3.32 µs █▇ ▂
(110.43 b … 208.17 b) 206.16 b ▅█▃█▃▅██▅▅█▃▃▆▁▁▅▁▁▁▃
5.61 ipc ( 91.61% cache) 1.06 branch misses
11.61k cycles 65.10k instructions 10.91 c-refs 0.92 c-misses
lodash.isEqual 17.07 µs/iter 16.83 µs █
(16.04 µs … 147.47 µs) 26.20 µs █▂
( 1.59 kb … 397.43 kb) 1.80 kb ███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.94 ipc ( 98.85% cache) 48.88 branch misses
66.75k cycles 263.12k instructions 2.75k c-refs 31.63 c-misses
summary
object-equals
3.51x faster than are-deeply-equal
4.32x faster than dequal
24.41x faster than lodash.isEqual
• Array Buffer (web-safe) [size=16386]
------------------------------------------- -------------------------------
object-equals 2.57 µs/iter 2.58 µs ▅ ▂ █▂▅
(2.53 µs … 2.66 µs) 2.65 µs █▇█▅███▂▂▂ ▅
(306.82 b … 416.19 b) 414.33 b ██████████▄▄█▄▄▁▁▁▇▁▄
5.85 ipc ( 99.67% cache) 1.09 branch misses
9.87k cycles 57.71k instructions 555.19 c-refs 1.84 c-misses
are-deeply-equal 9.85 µs/iter 9.86 µs █
(9.76 µs … 9.98 µs) 9.93 µs ▅▅ ▅ ▅▅▅ ▅█▅ ▅ ▅ ▅
(386.95 b … 392.54 b) 391.93 b ██▁▁█▁███▁███▁▁█▁█▁▁█
5.99 ipc ( 99.37% cache) 1.19 branch misses
37.82k cycles 226.52k instructions 479.03 c-refs 3.04 c-misses
dequal 11.90 µs/iter 11.93 µs █ ██ █ █ ████ █
(11.82 µs … 11.99 µs) 11.97 µs █ ██ █ █ ████ █
(208.14 b … 208.16 b) 208.15 b █▁██▁▁▁█▁█▁▁▁████▁▁▁█
5.65 ipc ( 99.52% cache) 1.19 branch misses
45.83k cycles 258.73k instructions 430.62 c-refs 2.06 c-misses
lodash.isEqual 54.68 µs/iter 54.88 µs █
(51.13 µs … 375.22 µs) 77.23 µs █
( 1.59 kb … 586.53 kb) 2.26 kb ▄█▂▅▂▂▂▁▁▁▂▂▁▁▁▁▁▁▁▁▁
4.40 ipc ( 97.53% cache) 57.56 branch misses
217.09k cycles 955.14k instructions 3.32k c-refs 82.29 c-misses
summary
object-equals
3.84x faster than are-deeply-equal
4.64x faster than dequal
21.31x faster than lodash.isEqual
Note
This table reflects web-safe
operation and for fairness, excludes node.isDeepStrictEqual
, which is not available in browser runtimes and would distort the comparison. object-equals
also leverages Buffer.compare
internally when is available, but gracefully falls back to cross-platform logic in web to ensure consistent and deterministic results.
Note
fast-equals
is also excluded from the both tests because it does not natively support ArrayBuffer and returns misleading results despite executing without errors. This behavior could lead to incorrect conclusions about its performance or correctness.
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 19.44 ns | 128.15 ns | 146.13 ns | 310.52 ns | 1.00x (baseline) |
dequal | 19.58 ns | 390.30 ns | 2.88 µs | 11.65 µs | 1.01x-37.51x slower |
fast-equals | 22.95 ns | 388.46 ns | 2.81 µs | 11.82 µs | 1.18x-38.05x slower |
are-deeply-equal | 44.95 ns | 343.79 ns | 2.37 µs | 9.90 µs | 2.31x-31.89x slower |
node.isDeepStrictEqual | 635.04 ns | 610.07 ns | 680.73 ns | 916.30 ns | 32.67x-2.95x slower |
lodash.isEqual | 1.95 µs | 3.56 µs | 14.72 µs | 54.47 µs | 100.49x-175.40x slower |
Full benchmark results with hardware counters
clk: ~3.66 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Typed Array [size=16]
------------------------------------------- -------------------------------
object-equals 19.44 ns/iter 19.08 ns █
(17.94 ns … 83.96 ns) 26.22 ns █
( 0.10 b … 50.29 b) 0.21 b ▂▄██▂▃▂▁▁▁▁▁▂▁▁▁▁▁▁▁▁
5.24 ipc ( 93.33% cache) 0.01 branch misses
75.05 cycles 393.19 instructions 0.04 c-refs 0.00 c-misses
are-deeply-equal 44.95 ns/iter 44.24 ns █
(42.69 ns … 139.71 ns) 91.34 ns █
( 34.94 b … 280.21 b) 184.24 b ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.02 ipc ( 96.68% cache) 0.01 branch misses
172.93 cycles 695.33 instructions 6.11 c-refs 0.20 c-misses
fast-equals 22.95 ns/iter 22.87 ns █ ▄
(21.30 ns … 91.93 ns) 29.58 ns ▂█ █
( 0.09 b … 48.15 b) 0.22 b ████▇▃▄▂▂▁▁▁▁▄▃▂▂▂▁▁▁
4.90 ipc ( 92.72% cache) 0.01 branch misses
89.42 cycles 437.96 instructions 0.04 c-refs 0.00 c-misses
dequal 19.58 ns/iter 19.06 ns █
(18.83 ns … 138.42 ns) 28.50 ns █
( 0.09 b … 64.31 b) 0.19 b █▂▂▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
5.12 ipc ( 91.12% cache) 0.01 branch misses
75.16 cycles 384.83 instructions 0.04 c-refs 0.00 c-misses
lodash.isEqual 1.95 µs/iter 1.97 µs ▂ ███ ▆
(1.86 µs … 2.12 µs) 2.11 µs █▃███▃█▃
(591.00 b … 1.10 kb) 740.80 b ▃▅▃████████▅▇▁▇▁▃▅▁▃▃
2.38 ipc ( 99.73% cache) 7.07 branch misses
7.49k cycles 17.80k instructions 862.64 c-refs 2.30 c-misses
node.isDeepStrictEqual 635.04 ns/iter 639.04 ns █
(594.77 ns … 856.31 ns) 798.58 ns ▇█▅
(322.09 b … 629.86 b) 480.13 b ▃▄███▇▆▂▂▂▂▂▂▁▁▁▁▁▁▁▂
2.32 ipc ( 99.60% cache) 0.14 branch misses
2.44k cycles 5.66k instructions 244.86 c-refs 0.97 c-misses
summary
object-equals
1.01x faster than dequal
1.18x faster than fast-equals
2.31x faster than are-deeply-equal
32.67x faster than node.isDeepStrictEqual
100.49x faster than lodash.isEqual
• Typed Array [size=512]
------------------------------------------- -------------------------------
object-equals 128.15 ns/iter 126.21 ns █
(119.74 ns … 500.65 ns) 196.82 ns █
( 32.57 b … 328.19 b) 208.14 b ▅██▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.00 ipc ( 95.76% cache) 0.02 branch misses
486.19 cycles 1.46k instructions 7.31 c-refs 0.31 c-misses
are-deeply-equal 343.79 ns/iter 347.35 ns █
(319.69 ns … 459.64 ns) 432.11 ns ▅▄ █
( 33.82 b … 293.95 b) 184.12 b ██▅▇█▄▃▅▃▃▂▂▁▂▂▂▁▁▂▁▁
5.66 ipc ( 95.35% cache) 1.02 branch misses
1.33k cycles 7.52k instructions 6.43 c-refs 0.30 c-misses
fast-equals 388.46 ns/iter 385.35 ns █
(381.92 ns … 578.41 ns) 457.42 ns █▄
( 0.09 b … 143.10 b) 0.80 b ██▃▂▁▁▁▁▂▂▁▁▁▁▁▁▁▁▁▁▁
5.51 ipc ( 79.07% cache) 1.01 branch misses
1.50k cycles 8.25k instructions 0.17 c-refs 0.04 c-misses
dequal 390.30 ns/iter 392.57 ns ▃█
(378.01 ns … 541.94 ns) 464.06 ns ██
( 0.09 b … 156.63 b) 0.50 b ███▅▄▄▃▃▂▃▂▁▂▂▁▁▁▁▁▁▁
5.48 ipc ( 80.43% cache) 1.01 branch misses
1.50k cycles 8.20k instructions 0.34 c-refs 0.07 c-misses
lodash.isEqual 3.56 µs/iter 3.58 µs ▃ █▃█ █
(3.48 µs … 3.65 µs) 3.64 µs ▇█▂▇███ █▇▇
(650.56 b … 831.83 b) 737.19 b ▆▁▁▆▆███████▆███▁▆▆▁▆
3.39 ipc ( 99.64% cache) 7.69 branch misses
13.79k cycles 46.80k instructions 918.11 c-refs 3.29 c-misses
node.isDeepStrictEqual 610.07 ns/iter 622.03 ns █
(576.14 ns … 695.37 ns) 688.73 ns ███ ▃▆▂
(289.70 b … 621.71 b) 480.11 b ▂█████████▅▅▅▁▄▃▁▁▁▁▂
2.34 ipc ( 99.64% cache) 0.14 branch misses
2.43k cycles 5.69k instructions 256.60 c-refs 0.91 c-misses
summary
object-equals
2.68x faster than are-deeply-equal
3.03x faster than fast-equals
3.05x faster than dequal
4.76x faster than node.isDeepStrictEqual
27.78x faster than lodash.isEqual
• Typed Array [size=4096]
------------------------------------------- -------------------------------
object-equals 146.13 ns/iter 145.59 ns █
(137.96 ns … 210.06 ns) 192.11 ns ▅█
( 57.16 b … 328.20 b) 208.17 b ▁███▄▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.29 ipc ( 95.58% cache) 0.02 branch misses
586.13 cycles 1.93k instructions 7.83 c-refs 0.35 c-misses
are-deeply-equal 2.37 µs/iter 2.35 µs ▅█
(2.32 µs … 2.78 µs) 2.75 µs ██
(175.28 b … 184.48 b) 183.98 b ██▄▁▁▂▁▄▃▂▁▁▂▁▁▁▁▁▁▁▂
5.99 ipc ( 93.26% cache) 1.04 branch misses
9.49k cycles 56.81k instructions 8.54 c-refs 0.58 c-misses
fast-equals 2.81 µs/iter 2.82 µs █
(2.79 µs … 2.84 µs) 2.84 µs █ ▃ ▃▆▃▃
( 0.09 b … 0.46 b) 0.10 b ▆▆█▄█▆██████▁▄▆▆█▄█▁▆
5.68 ipc ( 80.86% cache) 1.04 branch misses
11.40k cycles 64.73k instructions 1.68 c-refs 0.32 c-misses
dequal 2.88 µs/iter 2.90 µs █
(2.79 µs … 3.22 µs) 3.19 µs ▆█▃
( 0.09 b … 0.41 b) 0.10 b ███▇▅▅▅▁▁▁▂▂▂▄▁▁▁▂▂▂▄
5.66 ipc ( 80.18% cache) 1.04 branch misses
11.43k cycles 64.67k instructions 1.68 c-refs 0.33 c-misses
lodash.isEqual 14.72 µs/iter 14.76 µs █
(13.63 µs … 151.38 µs) 21.32 µs ▅█ ▇
( 1.07 kb … 394.01 kb) 1.26 kb ██▂█▁▁▁▁▁▂▂▂▂▁▁▁▁▁▁▁▁
4.17 ipc ( 99.02% cache) 38.05 branch misses
59.41k cycles 247.52k instructions 1.79k c-refs 17.60 c-misses
node.isDeepStrictEqual 680.73 ns/iter 689.81 ns ▅█▅▄
(644.14 ns … 755.77 ns) 743.47 ns ██████▅
(373.54 b … 623.90 b) 480.11 b ▃▄▆███████▆█▇▄▆▃▂▅▃▂▂
2.36 ipc ( 99.61% cache) 0.17 branch misses
2.61k cycles 6.17k instructions 283.14 c-refs 1.10 c-misses
summary
object-equals
4.66x faster than node.isDeepStrictEqual
16.19x faster than are-deeply-equal
19.25x faster than fast-equals
19.73x faster than dequal
100.71x faster than lodash.isEqual
• Typed Array [size=16386]
------------------------------------------- -------------------------------
object-equals 310.52 ns/iter 312.36 ns █
(291.90 ns … 409.40 ns) 379.15 ns ▃ █▂
( 57.29 b … 328.52 b) 207.89 b ▇█▇▆██▄▂▂▂▂▂▂▂▁▁▁▁▁▁▁
2.94 ipc ( 99.91% cache) 1.02 branch misses
1.21k cycles 3.56k instructions 546.08 c-refs 0.50 c-misses
are-deeply-equal 9.90 µs/iter 9.86 µs █
(9.75 µs … 10.80 µs) 9.90 µs ▅ ▅▅▅▅▅ ▅ ▅▅▅ █▅
(178.93 b … 184.48 b) 183.89 b █▁▁▁█████▁▁█▁███▁▁▁██
6.02 ipc ( 99.48% cache) 1.15 branch misses
37.52k cycles 225.87k instructions 482.27 c-refs 2.49 c-misses
fast-equals 11.82 µs/iter 11.84 µs █ █
(11.76 µs … 11.87 µs) 11.85 µs ▅▅ ▅ █ ▅ ▅ █▅
( 0.10 b … 0.10 b) 0.10 b ██▁▁▁█▁▁▁▁█▁█▁█▁▁▁▁██
5.68 ipc ( 99.69% cache) 1.14 branch misses
45.49k cycles 258.37k instructions 293.83 c-refs 0.91 c-misses
dequal 11.65 µs/iter 11.86 µs █ █
(11.30 µs … 11.89 µs) 11.89 µs ▅▅ ▅ █ ▅▅ █▅
( 0.10 b … 0.41 b) 0.12 b ██▁▁▁█▁▁▁▁█▁██▁▁▁▁▁██
5.67 ipc ( 99.66% cache) 1.13 branch misses
45.57k cycles 258.31k instructions 364.61 c-refs 1.22 c-misses
lodash.isEqual 54.47 µs/iter 53.30 µs █
(52.67 µs … 176.37 µs) 73.85 µs █
( 1.07 kb … 170.23 kb) 1.50 kb █▆▂▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.48 ipc ( 98.13% cache) 40.40 branch misses
209.07k cycles 937.49k instructions 2.53k c-refs 47.37 c-misses
node.isDeepStrictEqual 916.30 ns/iter 929.47 ns █▃
(855.19 ns … 1.02 µs) 994.24 ns ▄██▄
(156.62 b … 795.09 b) 480.09 b ▄▃▇▄▄▆▆████▇█▆▅▄▂▄▂▂▂
2.20 ipc ( 99.85% cache) 1.17 branch misses
3.55k cycles 7.81k instructions 941.52 c-refs 1.37 c-misses
summary
object-equals
2.95x faster than node.isDeepStrictEqual
31.89x faster than are-deeply-equal
37.51x faster than dequal
38.05x faster than fast-equals
175.4x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 18.78 ns | 143.03 ns | 683.49 ns | 2.54 µs | 1.00x (baseline) |
dequal | 19.30 ns | 385.19 ns | 2.97 µs | 12.02 µs | 1.03x-4.74x slower |
fast-equals | 22.06 ns | 394.27 ns | 2.98 µs | 11.90 µs | 1.17x-4.69x slower |
are-deeply-equal | 48.52 ns | 345.69 ns | 2.49 µs | 9.71 µs | 2.58x-3.83x slower |
lodash.isEqual | 1.94 µs | 3.52 µs | 15.17 µs | 54.11 µs | 103.36x-21.34x slower |
Full benchmark results with hardware counters
clk: ~3.62 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Typed Array [size=16]
------------------------------------------- -------------------------------
object-equals 18.78 ns/iter 18.78 ns █
(17.86 ns … 75.90 ns) 26.90 ns ██▂
( 0.10 b … 58.52 b) 0.21 b ███▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
5.24 ipc ( 93.91% cache) 0.01 branch misses
74.79 cycles 392.12 instructions 0.04 c-refs 0.00 c-misses
are-deeply-equal 48.52 ns/iter 48.02 ns █
(42.44 ns … 156.73 ns) 90.14 ns █
( 34.94 b … 264.18 b) 184.24 b ▁▁█▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.53 ipc ( 96.70% cache) 0.01 branch misses
196.85 cycles 695.69 instructions 6.11 c-refs 0.20 c-misses
fast-equals 22.06 ns/iter 21.88 ns █
(21.56 ns … 100.60 ns) 27.04 ns █▇
( 0.09 b … 64.14 b) 0.20 b ██▃▃▃▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
4.90 ipc ( 94.20% cache) 0.01 branch misses
89.40 cycles 438.04 instructions 0.04 c-refs 0.00 c-misses
dequal 19.30 ns/iter 19.06 ns █
(17.87 ns … 85.28 ns) 34.90 ns █▂
( 0.09 b … 52.21 b) 0.18 b ██▃▂▁▄▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
5.13 ipc ( 92.91% cache) 0.01 branch misses
75.07 cycles 384.79 instructions 0.03 c-refs 0.00 c-misses
lodash.isEqual 1.94 µs/iter 1.95 µs █
(1.86 µs … 2.31 µs) 2.28 µs ▂█▄▂
(522.76 b … 982.76 b) 736.51 b ████▆▅▃▃▁▂▂▁▁▂▁▂▁▁▃▃▂
2.42 ipc ( 99.70% cache) 7.34 branch misses
7.35k cycles 17.77k instructions 875.36 c-refs 2.63 c-misses
summary
object-equals
1.03x faster than dequal
1.17x faster than fast-equals
2.58x faster than are-deeply-equal
103.36x faster than lodash.isEqual
• Typed Array [size=512]
------------------------------------------- -------------------------------
object-equals 143.03 ns/iter 140.04 ns █
(134.79 ns … 371.58 ns) 235.04 ns ▅█
( 53.18 b … 320.20 b) 208.14 b ██▃▂▂▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁
4.92 ipc ( 95.71% cache) 0.02 branch misses
548.72 cycles 2.70k instructions 7.12 c-refs 0.31 c-misses
are-deeply-equal 345.69 ns/iter 345.19 ns █
(329.11 ns … 545.74 ns) 404.24 ns █
( 45.88 b … 323.63 b) 184.14 b ▁▂▃██▅▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁
5.65 ipc ( 95.67% cache) 1.02 branch misses
1.33k cycles 7.52k instructions 6.37 c-refs 0.28 c-misses
fast-equals 394.27 ns/iter 408.53 ns █▅ █
(361.02 ns … 599.40 ns) 510.18 ns ██▅█
( 0.09 b … 127.56 b) 0.50 b ████▆▃▃▃▄▄▄▃▃▅▄▃▁▁▂▂▂
5.52 ipc ( 79.96% cache) 1.01 branch misses
1.49k cycles 8.25k instructions 0.22 c-refs 0.04 c-misses
dequal 385.19 ns/iter 381.08 ns █
(377.70 ns … 521.27 ns) 483.92 ns █
( 0.09 b … 166.39 b) 0.83 b ██▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
5.55 ipc ( 80.64% cache) 1.01 branch misses
1.48k cycles 8.20k instructions 0.20 c-refs 0.04 c-misses
lodash.isEqual 3.52 µs/iter 3.54 µs ▅█ ▅
(3.40 µs … 3.74 µs) 3.62 µs ██▆██▃ ▃
(583.45 b … 898.58 b) 737.25 b █▁▁▁▁▁████████▁▄█▄▄▁▄
3.43 ipc ( 99.63% cache) 7.07 branch misses
13.64k cycles 46.74k instructions 925.37 c-refs 3.44 c-misses
summary
object-equals
2.42x faster than are-deeply-equal
2.69x faster than dequal
2.76x faster than fast-equals
24.6x faster than lodash.isEqual
• Typed Array [size=4096]
------------------------------------------- -------------------------------
object-equals 683.49 ns/iter 689.57 ns █
(669.37 ns … 769.77 ns) 747.45 ns █▃
(202.21 b … 428.27 b) 209.02 b ███▅▃▄▄▃▃▂▂▂▂▂▁▁▂▂▁▁▁
5.73 ipc ( 94.91% cache) 1.02 branch misses
2.62k cycles 15.02k instructions 8.43 c-refs 0.43 c-misses
are-deeply-equal 2.49 µs/iter 2.50 µs █
(2.44 µs … 2.77 µs) 2.75 µs ▇▇█▂▂
(175.28 b … 184.48 b) 183.97 b █████▄▂▂▄▂▁▁▂▁▁▁▁▁▂▁▂
5.92 ipc ( 94.58% cache) 1.04 branch misses
9.59k cycles 56.81k instructions 11.66 c-refs 0.63 c-misses
fast-equals 2.98 µs/iter 2.98 µs █▅
(2.94 µs … 3.17 µs) 3.15 µs ▂██
( 0.09 b … 0.46 b) 0.10 b ███▅▄▁▅▁▁▂▁▅▁▁▂▁▂▁▂▁▄
5.63 ipc ( 84.59% cache) 1.04 branch misses
11.50k cycles 64.73k instructions 2.55 c-refs 0.39 c-misses
dequal 2.97 µs/iter 2.99 µs █▂▅
(2.94 µs … 3.08 µs) 3.06 µs ▇███▂▂ ▂▇ ▂
( 0.09 b … 0.42 b) 0.10 b ██████▄██▇▇▁▇█▄▁▁▄▁▁▄
5.66 ipc ( 85.03% cache) 1.04 branch misses
11.43k cycles 64.67k instructions 2.32 c-refs 0.35 c-misses
lodash.isEqual 15.17 µs/iter 14.92 µs █
(14.44 µs … 171.50 µs) 23.37 µs █
( 1.07 kb … 220.80 kb) 1.26 kb ▆█▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.14 ipc ( 98.88% cache) 37.90 branch misses
59.72k cycles 247.25k instructions 1.75k c-refs 19.62 c-misses
summary
object-equals
3.64x faster than are-deeply-equal
4.35x faster than dequal
4.37x faster than fast-equals
22.2x faster than lodash.isEqual
• Typed Array [size=16386]
------------------------------------------- -------------------------------
object-equals 2.54 µs/iter 2.55 µs ▄▂█
(2.48 µs … 2.76 µs) 2.71 µs ▃████
(160.31 b … 208.16 b) 207.22 b █████▇▇▅▅▇▁▅▁▁▃▁▁▁▅▁▃
5.89 ipc ( 99.83% cache) 1.04 branch misses
9.73k cycles 57.31k instructions 509.41 c-refs 0.87 c-misses
are-deeply-equal 9.71 µs/iter 9.72 µs █
(9.67 µs … 9.85 µs) 9.81 µs █ ██ █
(178.89 b … 184.48 b) 183.88 b █████▁▁▁█▁█▁▁▁▁▁▁▁▁▁█
6.02 ipc ( 99.56% cache) 1.10 branch misses
37.53k cycles 225.87k instructions 396.65 c-refs 1.74 c-misses
fast-equals 11.90 µs/iter 11.90 µs █
(11.78 µs … 12.28 µs) 12.05 µs ▅ ▅█▅▅ ▅ ▅ ▅ ▅
( 0.10 b … 0.10 b) 0.10 b █▁████▁█▁█▁▁█▁▁▁▁▁▁▁█
5.63 ipc ( 99.65% cache) 1.15 branch misses
45.91k cycles 258.37k instructions 326.91 c-refs 1.13 c-misses
dequal 12.02 µs/iter 12.04 µs █ █
(11.84 µs … 12.40 µs) 12.16 µs ▅█ ▅ ▅█ ▅ ▅ ▅
( 0.10 b … 0.41 b) 0.12 b ██▁▁▁█▁▁▁██▁▁█▁▁▁█▁▁█
5.57 ipc ( 99.57% cache) 1.12 branch misses
46.37k cycles 258.31k instructions 326.85 c-refs 1.40 c-misses
lodash.isEqual 54.11 µs/iter 53.11 µs █
(52.64 µs … 173.21 µs) 77.98 µs █
(624.00 b … 180.76 kb) 1.47 kb █▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.48 ipc ( 97.91% cache) 40.75 branch misses
209.29k cycles 937.51k instructions 2.36k c-refs 49.34 c-misses
summary
object-equals
3.83x faster than are-deeply-equal
4.69x faster than fast-equals
4.74x faster than dequal
21.34x faster than lodash.isEqual
Note
This table reflects web-safe
operation and for fairness, excludes node.isDeepStrictEqual
, which is not available in browser runtimes and would distort the comparison. object-equals
also leverages Buffer.compare
internally when is available, but gracefully falls back to cross-platform logic in web to ensure consistent and deterministic results.
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 12.38 ns | 111.63 ns | 155.57 ns | 309.08 ns | 1.00x (baseline) |
dequal | 19.41 ns | 368.89 ns | 2.96 µs | 11.92 µs | 1.57x-38.57x slower |
are-deeply-equal | 89.22 ns | 395.22 ns | 2.51 µs | 9.95 µs | 7.20x-32.18x slower |
node.isDeepStrictEqual | 559.34 ns | 545.81 ns | 583.50 ns | 861.16 ns | 45.17x-2.79x slower |
lodash.isEqual | 3.95 µs | 5.22 µs | 16.48 µs | 56.18 µs | 318.74x-181.76x slower |
Full benchmark results with hardware counters
clk: ~3.65 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Data View [size=16]
------------------------------------------- -------------------------------
object-equals 12.38 ns/iter 12.16 ns █
(12.09 ns … 50.63 ns) 17.07 ns █
( 0.10 b … 87.50 b) 0.18 b █▁▁▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.84 ipc ( 95.44% cache) 0.01 branch misses
50.91 cycles 246.50 instructions 0.04 c-refs 0.00 c-misses
are-deeply-equal 89.22 ns/iter 88.26 ns █
(84.59 ns … 199.33 ns) 135.25 ns █
(191.03 b … 520.28 b) 392.21 b ▆█▆▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁
3.39 ipc ( 96.33% cache) 0.02 branch misses
364.18 cycles 1.24k instructions 12.99 c-refs 0.48 c-misses
dequal 19.41 ns/iter 20.72 ns █
(18.28 ns … 65.45 ns) 24.65 ns █
( 0.09 b … 52.20 b) 0.18 b █▁▁▂▂▁▁▁▁▂▃▃▃▂▁▁▁▁▁▁▁
4.77 ipc ( 94.27% cache) 0.01 branch misses
71.80 cycles 342.72 instructions 0.04 c-refs 0.00 c-misses
lodash.isEqual 3.95 µs/iter 3.97 µs █
(3.85 µs … 4.18 µs) 4.17 µs ▆█ ▃ ▃
( 1.23 kb … 1.26 kb) 1.24 kb ▆▄█████▄█▁▁▄█▁▁▁▄▄▁▁▄
2.33 ipc ( 99.73% cache) 18.10 branch misses
15.15k cycles 35.27k instructions 1.75k c-refs 4.65 c-misses
node.isDeepStrictEqual 559.34 ns/iter 566.90 ns █▂
(523.54 ns … 787.46 ns) 753.33 ns █▄██
(313.79 b … 621.71 b) 480.16 b █████▆▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁
2.38 ipc ( 99.49% cache) 0.15 branch misses
2.20k cycles 5.24k instructions 180.74 c-refs 0.93 c-misses
summary
object-equals
1.57x faster than dequal
7.2x faster than are-deeply-equal
45.17x faster than node.isDeepStrictEqual
318.74x faster than lodash.isEqual
• Data View [size=512]
------------------------------------------- -------------------------------
object-equals 111.63 ns/iter 110.60 ns █▅
(98.30 ns … 305.59 ns) 172.83 ns ██
( 80.34 b … 319.51 b) 208.32 b ▂███▆▂▂▃▃▃▂▁▁▁▁▁▁▁▁▁▁
3.13 ipc ( 95.78% cache) 0.02 branch misses
428.12 cycles 1.34k instructions 7.28 c-refs 0.31 c-misses
are-deeply-equal 395.22 ns/iter 394.97 ns █
(386.00 ns … 450.30 ns) 442.91 ns ▂█▆
(241.86 b … 531.67 b) 392.18 b ▁███▄▄▃▂▁▁▁▁▂▁▁▁▁▁▁▁▁
5.30 ipc ( 95.78% cache) 1.02 branch misses
1.52k cycles 8.05k instructions 13.30 c-refs 0.56 c-misses
dequal 368.89 ns/iter 377.65 ns █
(356.49 ns … 545.97 ns) 418.59 ns ██▃ █
( 0.09 b … 182.39 b) 0.85 b ███▇▅▅▄█▅▂▂▂▂▁▁▁▁▁▁▁▁
4.86 ipc ( 79.51% cache) 1.01 branch misses
1.47k cycles 7.17k instructions 0.17 c-refs 0.03 c-misses
lodash.isEqual 5.22 µs/iter 5.24 µs █▄
(5.17 µs … 5.38 µs) 5.35 µs ▅██ ▅ ▅
( 1.23 kb … 1.28 kb) 1.24 kb █████▁█▁██▅▁▁▁▁▁▁▁▁▁▅
2.94 ipc ( 99.67% cache) 18.52 branch misses
21.43k cycles 63.10k instructions 1.81k c-refs 5.99 c-misses
node.isDeepStrictEqual 545.81 ns/iter 553.14 ns █▂▂
(507.97 ns … 610.82 ns) 604.56 ns ▃███▆▆
(180.50 b … 659.18 b) 480.11 b ▂▁▄▆▇██████▅▅▃▄▂▂▁▂▁▁
2.38 ipc ( 99.51% cache) 0.19 branch misses
2.22k cycles 5.28k instructions 190.20 c-refs 0.94 c-misses
summary
object-equals
3.3x faster than dequal
3.54x faster than are-deeply-equal
4.89x faster than node.isDeepStrictEqual
46.77x faster than lodash.isEqual
• Data View [size=4096]
------------------------------------------- -------------------------------
object-equals 155.57 ns/iter 164.60 ns █
(133.68 ns … 260.33 ns) 225.03 ns █▂ █▄
( 77.28 b … 320.20 b) 208.14 b ▄██▃▃▅██▆▄▂▂▂▂▂▁▁▁▁▁▁
3.31 ipc ( 96.83% cache) 0.02 branch misses
546.09 cycles 1.81k instructions 12.35 c-refs 0.39 c-misses
are-deeply-equal 2.51 µs/iter 2.52 µs ▅▂ █ ▂
(2.48 µs … 2.57 µs) 2.56 µs ▂▅██▂▇█ █ ▅ ▂
(383.32 b … 392.54 b) 392.01 b ▇███████▇█▇█▄▇▇█▄▁▄▄▄
5.96 ipc ( 94.75% cache) 1.05 branch misses
9.62k cycles 57.35k instructions 16.98 c-refs 0.89 c-misses
dequal 2.96 µs/iter 2.97 µs █ █
(2.94 µs … 3.15 µs) 3.02 µs ▃█▆▃██▃ █▆
( 0.09 b … 0.42 b) 0.10 b ███████████▄▄█▄▁▁█▁▁▄
4.93 ipc ( 81.93% cache) 1.04 branch misses
11.45k cycles 56.47k instructions 1.89 c-refs 0.34 c-misses
lodash.isEqual 16.48 µs/iter 16.08 µs █
(15.18 µs … 162.59 µs) 25.05 µs █▆
( 1.59 kb … 260.41 kb) 1.80 kb ▂██▃▁▁▁▁▁▃▁▁▁▁▁▁▁▁▁▁▁
3.95 ipc ( 99.03% cache) 48.05 branch misses
66.81k cycles 263.83k instructions 2.75k c-refs 26.75 c-misses
node.isDeepStrictEqual 583.50 ns/iter 585.84 ns █▇
(556.47 ns … 724.28 ns) 707.57 ns ███▂
(178.56 b … 651.15 b) 480.11 b ▄████▅▄▃▃▁▂▂▂▁▁▂▁▁▁▁▁
2.45 ipc ( 99.59% cache) 0.14 branch misses
2.35k cycles 5.76k instructions 231.14 c-refs 0.94 c-misses
summary
object-equals
3.75x faster than node.isDeepStrictEqual
16.12x faster than are-deeply-equal
19.06x faster than dequal
105.95x faster than lodash.isEqual
• Data View [size=16386]
------------------------------------------- -------------------------------
object-equals 309.08 ns/iter 308.50 ns █▆
(297.96 ns … 389.74 ns) 377.00 ns ██
( 93.37 b … 326.56 b) 208.27 b ▄██▇▄▃▂▁▁▃▁▁▁▁▁▁▁▁▁▁▁
2.78 ipc ( 99.92% cache) 1.02 branch misses
1.24k cycles 3.45k instructions 631.64 c-refs 0.53 c-misses
are-deeply-equal 9.95 µs/iter 10.24 µs █ █
(9.34 µs … 10.73 µs) 10.36 µs █ ▅ ▅▅ ▅▅ ▅▅ █▅▅
(387.01 b … 392.54 b) 391.94 b █▁█▁▁▁▁██▁██▁██▁▁▁███
6.00 ipc ( 99.40% cache) 1.15 branch misses
37.72k cycles 226.40k instructions 542.04 c-refs 3.25 c-misses
dequal 11.92 µs/iter 11.93 µs █
(11.88 µs … 11.98 µs) 11.96 µs █ █
( 0.10 b … 0.10 b) 0.10 b █▁█▁▁▁▁█▁▁██▁▁█▁▁▁▁▁█
4.93 ipc ( 99.75% cache) 1.13 branch misses
45.75k cycles 225.53k instructions 363.81 c-refs 0.93 c-misses
lodash.isEqual 56.18 µs/iter 55.18 µs █
(54.36 µs … 195.26 µs) 74.72 µs █
( 1.59 kb … 626.24 kb) 2.29 kb ▅█▂▁▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.41 ipc ( 97.27% cache) 55.13 branch misses
216.80k cycles 955.24k instructions 3.56k c-refs 97.31 c-misses
node.isDeepStrictEqual 861.16 ns/iter 864.33 ns ▄█▃
(824.40 ns … 982.87 ns) 927.28 ns ▅███▃
(250.78 b … 700.86 b) 480.09 b ▂▂▄▅█████▅▄▄▃▃▃▃▂▂▂▂▂
2.23 ipc ( 99.86% cache) 1.19 branch misses
3.31k cycles 7.40k instructions 883.27 c-refs 1.27 c-misses
summary
object-equals
2.79x faster than node.isDeepStrictEqual
32.18x faster than are-deeply-equal
38.57x faster than dequal
181.76x faster than lodash.isEqual
Library | 16 | 512 | 4096 | 16386 | Speed Range |
---|---|---|---|---|---|
object-equals | 12.31 ns | 92.20 ns | 669.83 ns | 3.00 µs | 1.00x (baseline) |
dequal | 19.21 ns | 387.72 ns | 3.00 µs | 12.05 µs | 1.56x-4.01x slower |
are-deeply-equal | 95.61 ns | 395.93 ns | 2.55 µs | 9.38 µs | 7.77x-3.12x slower |
lodash.isEqual | 3.85 µs | 5.41 µs | 17.13 µs | 56.60 µs | 312.74x-18.84x slower |
Full benchmark results with hardware counters
clk: ~3.74 GHz
cpu: AMD Ryzen 5 3600 6-Core Processor
runtime: node 24.1.0 (x64-linux)
benchmark avg (min … max) p75 / p99 (min … top 1%)
------------------------------------------- -------------------------------
• Data View [size=16]
------------------------------------------- -------------------------------
object-equals 12.31 ns/iter 11.92 ns █
(11.65 ns … 44.38 ns) 19.22 ns █
( 0.10 b … 60.78 b) 0.18 b ▂█▃▂▂▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁
4.85 ipc ( 93.48% cache) 0.01 branch misses
49.53 cycles 240.41 instructions 0.04 c-refs 0.00 c-misses
are-deeply-equal 95.61 ns/iter 102.67 ns █
(82.14 ns … 197.50 ns) 151.91 ns ██
(227.23 b … 512.27 b) 392.22 b ▅██▇▃▃▅▇▃▂▂▁▂▂▂▂▂▂▁▁▁
3.36 ipc ( 96.16% cache) 0.02 branch misses
368.19 cycles 1.24k instructions 13.10 c-refs 0.50 c-misses
dequal 19.21 ns/iter 18.54 ns █
(17.28 ns … 87.50 ns) 33.16 ns █
( 0.09 b … 60.44 b) 0.19 b ▅█▃▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
4.65 ipc ( 88.85% cache) 0.01 branch misses
73.70 cycles 342.64 instructions 0.04 c-refs 0.00 c-misses
lodash.isEqual 3.85 µs/iter 4.00 µs ▂ ██▂▂▂ ▂
(3.55 µs … 4.25 µs) 4.19 µs ▅ █ ▅ █████▅ █▅▅
( 1.23 kb … 1.26 kb) 1.24 kb █▇█▁█▇██████▇▇▇███▁▇▇
2.40 ipc ( 99.61% cache) 18.75 branch misses
14.67k cycles 35.28k instructions 1.75k c-refs 6.87 c-misses
summary
object-equals
1.56x faster than dequal
7.77x faster than are-deeply-equal
312.74x faster than lodash.isEqual
• Data View [size=512]
------------------------------------------- -------------------------------
object-equals 92.20 ns/iter 91.83 ns █
(88.52 ns … 167.46 ns) 118.59 ns █▄
( 0.10 b … 96.13 b) 0.33 b ▁██▄▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
5.85 ipc ( 83.06% cache) 0.01 branch misses
353.95 cycles 2.07k instructions 0.09 c-refs 0.01 c-misses
are-deeply-equal 395.93 ns/iter 397.61 ns █
(370.88 ns … 570.94 ns) 457.62 ns █▆
( 88.98 b … 550.70 b) 392.18 b ▃▅▄▅▆██▆▃▂▂▂▁▁▁▁▁▂▁▁▁
5.23 ipc ( 95.57% cache) 1.03 branch misses
1.54k cycles 8.05k instructions 13.68 c-refs 0.61 c-misses
dequal 387.72 ns/iter 388.30 ns ██
(359.75 ns … 571.28 ns) 486.62 ns ▂▂ ██
( 0.09 b … 150.38 b) 0.81 b ██▄██▇▃▃▄▂▂▂▂▂▁▁▃▁▁▁▁
4.81 ipc ( 76.94% cache) 1.01 branch misses
1.49k cycles 7.17k instructions 0.19 c-refs 0.04 c-misses
lodash.isEqual 5.41 µs/iter 5.44 µs █
(5.30 µs … 5.72 µs) 5.62 µs ▅ █ █
( 1.23 kb … 1.28 kb) 1.24 kb █▁█▅▅██▅█▅█▁▁▅▅▁▅▁▁▁▅
3.01 ipc ( 99.55% cache) 19.10 branch misses
20.95k cycles 63.01k instructions 1.79k c-refs 8.07 c-misses
summary
object-equals
4.21x faster than dequal
4.29x faster than are-deeply-equal
58.69x faster than lodash.isEqual
• Data View [size=4096]
------------------------------------------- -------------------------------
object-equals 669.83 ns/iter 671.92 ns █
(649.44 ns … 791.05 ns) 713.60 ns ▇█▃
( 0.10 b … 128.21 b) 0.60 b ▂▅▅▅███▆▃▄▄▂▂▃▃▂▂▂▂▁▁
5.94 ipc ( 82.84% cache) 1.02 branch misses
2.57k cycles 15.29k instructions 0.75 c-refs 0.13 c-misses
are-deeply-equal 2.55 µs/iter 2.59 µs █▂▂
(2.37 µs … 2.80 µs) 2.77 µs ███
(383.32 b … 392.54 b) 392.01 b ▇▃▇▇▃▅▇████▇▅▅▃▁▁▅▃▅▇
5.84 ipc ( 94.66% cache) 1.07 branch misses
9.83k cycles 57.35k instructions 21.57 c-refs 1.15 c-misses
dequal 3.00 µs/iter 3.01 µs █
(2.95 µs … 3.19 µs) 3.15 µs █▅
( 0.09 b … 0.42 b) 0.10 b ▇███▇▄▇▃▃▃▃▃▁▁▃▃▁▃▃▃▃
4.92 ipc ( 81.89% cache) 1.04 branch misses
11.48k cycles 56.47k instructions 2.54 c-refs 0.46 c-misses
lodash.isEqual 17.13 µs/iter 16.70 µs █
(15.99 µs … 178.07 µs) 27.33 µs █
( 1.59 kb … 226.95 kb) 1.79 kb ▇█▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
3.93 ipc ( 98.14% cache) 48.93 branch misses
67.14k cycles 263.69k instructions 2.81k c-refs 52.11 c-misses
summary
object-equals
3.8x faster than are-deeply-equal
4.47x faster than dequal
25.57x faster than lodash.isEqual
• Data View [size=16386]
------------------------------------------- -------------------------------
object-equals 3.00 µs/iter 2.92 µs █
(2.56 µs … 219.61 µs) 4.80 µs █
(360.00 b … 319.79 kb) 394.16 b ▁▁▄█▁▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁
4.82 ipc ( 99.77% cache) 31.10 branch misses
12.84k cycles 61.96k instructions 749.95 c-refs 1.73 c-misses
are-deeply-equal 9.38 µs/iter 9.39 µs █
(9.30 µs … 9.62 µs) 9.55 µs █ █ █
(383.44 b … 392.54 b) 391.49 b ██████▁███▁▁▁▁▁▁▁▁▁▁█
6.00 ipc ( 99.40% cache) 1.18 branch misses
37.75k cycles 226.40k instructions 487.18 c-refs 2.94 c-misses
dequal 12.05 µs/iter 11.93 µs █
(11.67 µs … 13.01 µs) 12.76 µs █▅
( 0.10 b … 0.10 b) 0.10 b ▇▁▁██▇▁▇▁▁▁▁▁▁▁▁▁▁▁▁▇
4.94 ipc ( 99.57% cache) 1.16 branch misses
45.68k cycles 225.53k instructions 293.91 c-refs 1.27 c-misses
lodash.isEqual 56.60 µs/iter 55.11 µs █
(54.30 µs … 184.11 µs) 97.29 µs █
( 1.59 kb … 704.98 kb) 2.26 kb █▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
4.37 ipc ( 97.39% cache) 57.49 branch misses
218.74k cycles 955.06k instructions 3.36k c-refs 87.56 c-misses
summary
object-equals
3.12x faster than are-deeply-equal
4.01x faster than dequal
18.84x faster than lodash.isEqual
Note
This table reflects web-safe
operation and for fairness, excludes node.isDeepStrictEqual
, which is not available in browser runtimes and would distort the comparison. object-equals
also leverages Buffer.compare
internally when is available, but gracefully falls back to cross-platform logic in web to ensure consistent and deterministic results.
Note
fast-equals
is also excluded from the both tests because it does not natively support DataView and returns misleading results despite executing without errors. This behavior could lead to incorrect conclusions about its performance or correctness.
All benchmarks use mitata for performance testing with data generated by object-generator
to reflect realistic and deeply nested object structures. The suite includes both synthetic and real-world data tests, including React specific cases.
# Big JSON Object (~1.2 MiB, deeply nested)
npm run benchmark
# React elements benchmark
npm run benchmark:react
# Structured, nested and large-scale benchmark with synthetic data
npm run benchmark:advanced
This package uses rollup to generate clean and optimized ESM builds.
To build package from source code, run:
npm run build
This will generate the output in the dist/
folder. Main (web-safe) and node (runtime-specific) builds are handled via custom rollup config and exposed under appropriate exports
in package.json
.
This package includes a carefully structured test suite, ensuring correctness and compatibility with expected semantics.
tests/
├─ objectEquals.test.js # Core tests with basic and edge cases
└─ objectEquals.lodash.test.js # Parity tests ported from lodash.isEqual
- The core tests cover basic type-specific checks, circular references, cross-realm objects, symbols, etc.
- The parity tests ensure alignment with lodash’s deep equality expectations (ported from QUnit to Vitest).
- All tests are written in Vitest with native ESM support and zero transform overhead.
You can run the full suite with:
npm test
or run individual tests:
npx vitest run tests/objectEquals.test.js
npx vitest run tests/objectEquals.lodash.test.js
Feel free to open issues or submit pull requests on GitHub.
This project is licensed under the MIT License.