Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
deepclone vs deepfreeze vs saferdeepclone2
Make deepclone safer, but check that it's not too much slower.
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0
Browser:
Firefox 121
Operating system:
Ubuntu
Device Platform:
Desktop
Date tested:
2 years ago
Test name
Executions per second
Lodash cloneDeep
1352551.8 Ops/sec
Json clone
658249.2 Ops/sec
freeze and destructure
5454291.5 Ops/sec
deepClone
10166412.0 Ops/sec
deepFreeze
3385820.5 Ops/sec
deepCloneSafe
9719253.0 Ops/sec
HTML Preparation code:
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js'></script>
Script Preparation code:
var MyObject = { description: 'Creates a deep copy of source, which should be an object or an array.', myNumber: 123456789, myBoolean: true, jayson: { stringify: 'JSON.stringify() method converts a JavaScript value to a JSON string....', parse: 'JSON.parse() method parses a JSON string...' } }; function deepFreeze(object) { for (const v of Array.isArray(object) ? object : Object.values(object)) { if (v && typeof v === 'object') { deepFreeze(v); } } Object.freeze(object); return object; } function deepClone(object) { if (Array.isArray(object)) { const len = object.length; const result = new Array(len); for (let i = 0; i < len; ++i) { const v = object[i]; result[i] = v && typeof v === 'object' ? deepClone(v) : v; } return result; } else { const result = {}; for (const k in object) { const v = object[k]; result[k] = v && typeof v === 'object' ? deepClone(v) : v; } return result; } } function deepCloneSafe(object) { if (!object) { return object; } if (typeof object !== 'object') { // this is not an array or an object, it's a primitive... // having a type system doesn't 100% prevent this... return object; } // also.. hopefully nobody ever uses `new String('a')` or `new Number(1)` // but protect against that edge case anyways.. if (typeof object.valueOf() !== 'object') { return new (object.constructor)(object.valueOf()); } if (Array.isArray(object)) { const len = object.length; const result = new Array(len); for (let i = 0; i < len; ++i) { const v = object[i]; result[i] = v && typeof v === 'object' ? deepCloneSafe(v) : v; } return result; } else { const result = {}; for (const k in object) { const v = object[k]; result[k] = v && typeof v === 'object' ? deepCloneSafe(v) : v; } return result; } } var myCopy = null;
Tests:
Lodash cloneDeep
myCopy = _.cloneDeep(MyObject);
Json clone
myCopy = JSON.parse(JSON.stringify(MyObject));
freeze and destructure
Object.freeze(MyObject); myCopy = { ...MyObject };
deepClone
myCopy = deepClone(MyObject)
deepFreeze
deepFreeze(MyObject); myCopy = MyObject
deepCloneSafe
myCopy = deepCloneSafe(MyObject)