sverweij / dependency-cruiser

Validate and visualize dependencies. Your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.
https://npmjs.com/dependency-cruiser
MIT License
5.27k stars 250 forks source link

refactor: replaces lodash/memoize with memoize #923

Closed sverweij closed 7 months ago

sverweij commented 7 months ago

Description

Motivation and Context

We should slowly be starting to replace lodash functions everywhere as lodash isn't really maintained anymore. Additionally lodash/memoize isn't the fastest memoization function around, it looks like.

The chosen alternative (memoize, formerly known as mem) isn't the fastest either, but

Other candidates either have fallen out of maintenance (e.g. 10y without updates, ...), or miss features we need.

Speed benchmarks adopted from `memize` (who adopted from them in turn from `moize`): - run on MacOS 12.7.4 on an 2,6Ghz Quad-Core Intel Core i7 with 16Gb RAM - See https://github.com/aduth/memize/tree/master/benchmark for details - The benchmark this ran was (1) adapted to run as ESM (2) adds lodash/memoize #### Single parameter ```text ┌────────────────────┬─────────────┬──────────────────────────┬─────────────┐ │ Name │ Ops / sec │ Relative margin of error │ Sample size │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ fast-memoize │ 127,482,919 │ ± 0.28% │ 94 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ moize │ 101,448,279 │ ± 0.16% │ 94 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ memoize │ 89,864,460 │ ± 0.15% │ 96 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ memize │ 75,527,611 │ ± 1.16% │ 93 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ lodash │ 50,176,290 │ ± 0.24% │ 95 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ ramda │ 48,060,225 │ ± 0.54% │ 94 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ underscore │ 30,460,634 │ ± 0.42% │ 93 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ memoizee │ 18,648,393 │ ± 0.51% │ 93 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ moize (serialized) │ 16,516,070 │ ± 0.25% │ 92 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ memoizerific │ 9,432,079 │ ± 0.97% │ 92 │ ├────────────────────┼─────────────┼──────────────────────────┼─────────────┤ │ memoizejs │ 1,610,735 │ ± 0.28% │ 94 │ └────────────────────┴─────────────┴──────────────────────────┴─────────────┘ ``` #### Multiple parameters, only primitives ```text ┌────────────────────┬────────────┬──────────────────────────┬─────────────┐ │ Name │ Ops / sec │ Relative margin of error │ Sample size │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ moize │ 32,944,874 │ ± 3.55% │ 79 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memize │ 32,530,910 │ ± 2.19% │ 65 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizee │ 11,358,939 │ ± 2.89% │ 90 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoize │ 9,380,007 │ ± 1.55% │ 88 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ moize (serialized) │ 8,536,549 │ ± 0.47% │ 90 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizerific │ 5,622,282 │ ± 1.19% │ 91 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ lodash │ 5,393,388 │ ± 0.73% │ 92 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizejs │ 1,101,890 │ ± 1.10% │ 92 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ fast-memoize │ 929,638 │ ± 0.22% │ 95 │ └────────────────────┴────────────┴──────────────────────────┴─────────────┘ ``` #### Multiple parameters, some parameters contain objects ```plaintext ┌────────────────────┬────────────┬──────────────────────────┬─────────────┐ │ Name │ Ops / sec │ Relative margin of error │ Sample size │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memize │ 30,529,321 │ ± 0.97% │ 89 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ moize │ 28,842,916 │ ± 0.77% │ 91 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizee │ 10,445,895 │ ± 1.02% │ 92 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoize │ 9,349,388 │ ± 0.50% │ 93 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizerific │ 6,107,483 │ ± 1.29% │ 92 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ lodash │ 5,029,315 │ ± 0.36% │ 92 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ memoizejs │ 808,879 │ ± 2.71% │ 94 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ moize (serialized) │ 796,306 │ ± 1.73% │ 88 │ ├────────────────────┼────────────┼──────────────────────────┼─────────────┤ │ fast-memoize │ 650,625 │ ± 3.18% │ 88 │ └────────────────────┴────────────┴──────────────────────────┴─────────────┘ ```

How Has This Been Tested?

Types of changes

Checklist

codeclimate[bot] commented 7 months ago

Code Climate has analyzed commit 39a4942c and detected 0 issues on this pull request.

View more on Code Climate.

socket-security[bot] commented 7 months ago

New dependencies detected. Learn more about Socket for GitHub ↗︎

Package New capabilities Transitives Size Publisher
npm/memoize@10.0.0 None +1 26.5 kB sindresorhus

View full report↗︎