Skip to content

A fast, flexible and robust utility for deep equality comparison with type-specific logic and engine-aware design.

License

Notifications You must be signed in to change notification settings

observ33r/object-equals

Repository files navigation

npm Size License

object-equals

A fast, flexible and robust utility for deep equality comparison with type-specific logic and engine-aware design.

Features

  • High Performance
    Outperforms popular libraries like lodash.isEqual, fast-equals, dequal, are-deeply-equal and node.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 against lodash.isEqual and edge case coverage.

  • Type-Safe
    Fully typed with TypeScript declarations.

Installation

npm install @observ33r/object-equals

Usage

objectEquals(target, source, [options])

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.

Options

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

objectEqualsCore(target, source, circular, crossrealm, react, symbols, fallback, cache)

The core comparison function, exposed for advanced use cases. Takes individual parameters instead of an options object.

Examples

Basic

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

Extended objects

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

Circular objects

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

Cross-Realm objects

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

React elements

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

Symbol keys

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

Catch unsupported types with fallback option

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

Basic benchmark

Big JSON Object (~1.2 MiB, deeply nested)

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.

React and Advanced benchmark

Important

Times for object sizes: 16, 512, 4096, 16386

React elements

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.

Object with mixed primitive values

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

Nested Object with mixed primitive values

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

Array with mixed primitive values

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

Nested Array with mixed primitive values

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

Map with mixed primitive values

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

Nested Map with mixed primitive values

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

Set with mixed primitive values

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

Shuffled Set with mixed primitive values

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

Nested Set with mixed primitive values

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.

Shuffled nested Set with mixed primitive values

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.

Array Buffer

Runtime-specific

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

Web-safe

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.

Typed Array

Runtime-specific

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

Web-safe

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.

Data View

Runtime-specific

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

Web-safe

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.

Running Benchmarks

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 

Build

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.

Testing

This package includes a carefully structured test suite, ensuring correctness and compatibility with expected semantics.

Structure

tests/
├─ objectEquals.test.js          # Core tests with basic and edge cases
└─ objectEquals.lodash.test.js   # Parity tests ported from lodash.isEqual

Notes

  • 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

Contributing

Feel free to open issues or submit pull requests on GitHub.

License

This project is licensed under the MIT License.