Test name | Executions per second |
---|---|
produce | 359664.6 Ops/sec |
structuredClone | 141.1 Ops/sec |
<script type="module">
import { produce } from 'https://cdn.jsdelivr.net/npm/immer@10.1.1/+esm';
window.immerProduce = produce;
</script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/uuid@10.0.0/dist/index.min.js"></script>
const numSiblings = 500;
const depth = 3;
state = {
data: {
data1: {
data2: 'test',
siblings: Array.from({
length: numSiblings
}).map(() => ({
id: crypto.randomUUID()
})),
children: Array.from({
length: depth
}).map(() => ({
id: crypto.randomUUID(),
data: {
data1: {
data2: 'test',
siblings: Array.from({
length: numSiblings
}).map(() => ({
id: crypto.randomUUID()
})),
children: Array.from({
length: depth
}).map(() => ({
id: crypto.randomUUID(),
data: {
data1: {
data2: 'test',
siblings: Array.from({
length: numSiblings
}).map(() => ({
id: crypto.randomUUID()
})),
children: Array.from({
length: depth
}).map(() => ({
id: crypto.randomUUID(),
data: {
data1: {
data2: 'test',
siblings: Array.from({
length: numSiblings
}).map(() => ({
id: crypto.randomUUID()
})),
},
},
})),
},
},
})),
},
},
})),
},
data3: Array.from({
length: 1000
}).map(() => ({})),
},
};
const result = immerProduce(state, draft => {
draft.data.data1.data2 = 'updated';
for (let i; i < 500; i++) {
draft.data.data1.siblilngs[i] = { id: uuidv4() };
}
})
const result = structuredClone(state);
result.data.data1.data2 = 'updated';
for (let i; i < 500; i++) {
result.data.data1.siblilngs[i] = { id: uuidv4() };
}