불변 데이터를 위한 빠른 js 라이브러리인 Limu
34473 단어 limu
리무 🍋
limu
는 불변 객체의 효율적인 생성과 운용을 위해 탄생한 불변의 사랑이 부족합니다.다른 상황에서
immer
보다 거의 2배 또는 20배 이상 빠릅니다.놀라운 결과를 검토하려면 이online perf demo를 클릭하십시오.
더 많은 성능 테스트 결과 보기
1. git clone [email protected]:tnfe/limu.git
2. cd benchmark
3. npm i
4. node ./limu-vs-immer.js
Why is Limu born? Because I plan to release concent V3 next year, I need a more fast immutable data JS operation tool, so Limu was born
성능 ⚡️
다른 상황에서
immer
보다 거의 2배 또는 20배 이상 빠릅니다.간단한 데모
cd benchmark
및 node ./readme-demo.js
bash 명령을 실행합니다.아래 실행Code:
const immer = require('immer');
const limu = require('limu');
immer.setAutoFreeze(false);
limu.setAutoFreeze(false);
function getBase() {
const base = {
a: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a1: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a2: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a3: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a4: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a5: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a6: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a7: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a8: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a9: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a10: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a11: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
a12: { b: { c: { d: { e: { f: { g: { h: { i: { j: { k: { l: { m: { n: 1 } } } } } } } } } } } } },
arr: [1, 2, 3],
b: null,
};
return base;
};
function die(label) {
throw new Error(label);
};
function oneBenchmark(lib, base) {
const start = Date.now();
const draft = lib.createDraft(base);
draft.a.b.c.d.e.f.g = 999;
draft.arr[1] = 100;
const final = lib.finishDraft(draft);
if (final === base) {
die('should not be equal');
}
if (final.arr[1] !== 100) {
die('final.arr[1] !== 100');
}
if (base.arr[1] !== 2) {
die('base.arr[1] !== 1');
}
const draft2 = lib.createDraft(base);
delete draft2.b;
const final2 = lib.finishDraft(draft2);
if (final2 === base) {
die('should not be equal');
}
if (base.b !== null) {
die('base.b should be null');
}
const taskSpend = Date.now() - start;
return taskSpend;
}
function measureBenchmark(label, loopLimit) {
const immutLibs = { limu, immer };
const lib = immutLibs[label];
console.log(` ------------- ${label} benchmark ------------- `);
const base = getBase();
let totalSpend = 0;
for (let i = 0; i < loopLimit; i++) {
totalSpend += oneBenchmark(lib, base);
}
console.log(`${label} avg spend ${totalSpend / loopLimit} ms \n`);
}
measureBenchmark('limu', 10000);
measureBenchmark('immer', 10000);
MacBook 2021 m1 max
에서 성능 결과는 다음과 같습니다. ------------- limu benchmark -------------
limu avg spend 0.0066 ms
------------- immer benchmark -------------
immer avg spend 0.0446 ms
보시다시피 위에서 언급한 사례에서 limu는 immer보다 거의 7배 더 빠릅니다.
복잡한 데모
보다 복잡한 성능 테스트를 수행하려면 아래 단계를 따르십시오.
1. cd benchmark
2. npm i
3. node ./limu-vs-immer.js
다양한 상황의 성능을 테스트하기 위해 매개변수
hasArr
、 lessDeepOp
를 변경할 수 있습니다.// // ************************************************************************
const curStrategy = process.env.ST || strategyConsts.BASE_F_AUTO_F;
// change params 'hasArr'、'lessDeepOp' to test limu and immer performance in different situations
// then run npm cmd: `npm run s1`、`npm run s2`、`npm run s3`、`npm run s4` to see perf result
const hasArr = false; // operate arr or not
const lessDeepOp = true; // has more deep operation or not
// ************************************************************************
macbook 2021 max pro의 성능 결과는 다음과 같습니다.
-----------------------[ hasArr true, lessOp true ]-------------------
(reuseBase: true, autoFreeze: true) immer 2.797 ms : limu 1.287 ms
(reuseBase: false, autoFreeze: true) immer 2.835 ms : limu 1.313 ms
(reuseBase: true, autoFreeze: false) immer 2.049 ms : limu 0.089 ms
(reuseBase: false, autoFreeze: false) immer 2.096 ms : limu 0.146 ms
-----------------------[ hasArr true, lessOp false ]------------------
(reuseBase: true, autoFreeze: true) immer 2.946 ms : limu 1.268 ms
(reuseBase: false, autoFreeze: true) immer 3.005 ms : limu 1.345 ms
(reuseBase: true, autoFreeze: false) immer 2.162 ms : limu 0.147 ms
(reuseBase: false, autoFreeze: false) immer 2.169 ms : limu 0.161 ms
-----------------------[ hasArr false, lessOp true ]--------------------------
(reuseBase: true, autoFreeze: true) immer 2.253 ms : limu 0.659 ms
(reuseBase: false, autoFreeze: true) immer 2.261 ms : limu 0.705 ms
(reuseBase: true, autoFreeze: false) immer 1.386 ms : limu 0.015 ms
(reuseBase: false, autoFreeze: false) immer 1.469 ms : limu 0.017 ms
-----------------------[ hasArr false, lessOp false ]--------------------------
(reuseBase: true, autoFreeze: true) immer 2.266 ms : limu 0.604 ms
(reuseBase: false, autoFreeze: true) immer 2.201 ms : limu 0.643 ms
(reuseBase: true, autoFreeze: false) immer 1.565 ms : limu 0.055 ms
(reuseBase: false, autoFreeze: false) immer 1.479 ms : limu 0.061 ms
테스트 제출
limu git repo의 벤치마크 디렉토리에 테스트를 제출하는 것을 환영합니다.
Reference
이 문제에 관하여(불변 데이터를 위한 빠른 js 라이브러리인 Limu), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fantasticsoul/limu-a-fast-immutable-lib-1bf8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)