fast-is-equal
Version:
Blazing-fast equality checks, minus the baggage. A lean, standalone alternative to Lodash's isEqualβbecause speed matters.
99 lines (65 loc) β’ 6.04 kB
Markdown
# fast-is-equal
β‘οΈBlazing-fast equality checks, minus the baggage. A lean, standalone alternative to Lodash's `isEqual` - because speed matters.
[](https://badge.fury.io/js/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal/blob/main/LICENSE)  [](https://github.com/JairajJangle/fast-is-equal/actions/workflows/ci.yml) [](https://github.com/JairajJangle/fast-is-equal/actions/workflows/ci.yml) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/JairajJangle/fast-is-equal) [](https://github.com/sponsors/JairajJangle)
## 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:
```bash
yarn add fast-is-equal
```
Using npm:
```bash
npm install fast-is-equal
```
## Usage
```typescript
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**: `fastIsEqual` is **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](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
## π Support the project
<p align="center" valign="center"> <a href="https://liberapay.com/FutureJJ/donate"> <img src="https://liberapay.com/assets/widgets/donate.svg" alt="LiberPay_Donation_Button" height="50" > </a> <a href=".github/assets/Jairaj_Jangle_Google_Pay_UPI_QR_Code.jpg"> <img src=".github/assets/upi.png" alt="Paypal_Donation_Button" height="50" > </a> <a href="https://www.paypal.com/paypalme/jairajjangle001/usd"> <img src=".github/assets/paypal_donate.png" alt="Paypal_Donation_Button" height="50" > </a> </p>