fast-is-equal
️Blazing-fast equality checks, minus the baggage. A lean, standalone alternative to Lodash's isEqual - because speed matters.
Why fast-is-equal?
- Lightning Speed: Up to 64.53x faster than Lodash's
isEqual(average 13.21x faster across 49 test cases). - Lightweight: Dependency-free, minimal footprint.
- Versatile: Handles primitives, objects, arrays, Maps, Sets, typed arrays, circular references, and more.
- Proven: Outperforms Lodash in 98% of benchmark cases.
Installation
Using yarn:
yarn add fast-is-equal
Using npm:
npm install fast-is-equal
Usage
import { fastIsEqual } from 'fast-is-equal';
console.log(fastIsEqual(1, 1)); // true
console.log(fastIsEqual({ a: 1 }, { a: 1 })); // true
console.log(fastIsEqual([1, 2], [1, 3])); // false
Performance Benchmarks
fast-is-equal was tested against Lodash's isEqual across 49 diverse test cases with 1,000,000 iterations each. The results speak for themselves:
Key Highlights
- Average Speed:
fastIsEqualis 13.21x faster (0.000147 ms vs. 0.001941 ms). - Win Rate: Outperforms Lodash in 48/49 cases (98.0%).
- Peak Performance: Up to 64.53x faster for large Sets.
Top 10 Performance Gains
| Test Case | fastIsEqual (ms) | Lodash isEqual (ms) | Speed Boost |
|---|---|---|---|
| Large Set (100 items) | 0.000585 | 0.037756 | 64.53x |
| Large Map (50 entries) | 0.000912 | 0.025252 | 27.70x |
| Map vs Set | 0.000018 | 0.000469 | 26.45x |
| ArrayBuffer (small) | 0.000068 | 0.001242 | 18.40x |
| Empty Map | 0.000037 | 0.000661 | 18.04x |
| Empty Set | 0.000037 | 0.000668 | 17.96x |
| Map with primitives | 0.000081 | 0.001405 | 17.27x |
| Uint8Array | 0.000038 | 0.000654 | 17.08x |
| Map (unequal) | 0.000080 | 0.001316 | 16.41x |
| Float32Array | 0.000041 | 0.000652 | 15.72x |
Performance Across Categories
- Primitives: Competitive performance with smart optimizations for edge cases like NaN
- Objects: 1.45x–3.02x faster, with best gains on simple and nested structures
- Arrays: 2.40x–4.06x faster, excelling at primitive arrays and sparse arrays
- TypedArrays: 12.62x–17.08x faster, dramatically outperforming on all variants
- Special Objects: 9.43x–10.95x faster for Dates and RegExp
- Collections: 11.34x–64.53x faster for Maps and Sets, with exceptional gains on large collections
- Circular References: 3.48x–3.87x faster with optimized cycle detection
Detailed Benchmark Results
Run yarn benchmark or npm run benchmark to test locally. Full results available in benchmarks/results.txt.
Edge Cases Where Lodash Wins
Only 1 case where Lodash marginally outperforms:
- Strings: 0.85x slower
This is a ~5-nanosecond comparison at the benchmark's measurement resolution, with negligible real-world impact.
Features
- Dependency-Free: No bloat, just performance.
- Comprehensive: Supports all JavaScript types, including edge cases like circular references and typed arrays.
- Optimized: Fine-tuned for real-world use cases (e.g., API responses, state objects).
License
MIT