Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
Object Deep Copy test 20240213-2
Produce a deep copy of a Javascript object where nested objects are not simply references to the originals.
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Browser:
Firefox 115
Operating system:
Windows
Device Platform:
Desktop
Date tested:
2 years ago
Test name
Executions per second
Recursive Deep Copy
2299076.8 Ops/sec
JSON Deep Copy
57647.3 Ops/sec
lodash clone
26766.2 Ops/sec
c7x43t
64004.3 Ops/sec
recursiveDeepCopy_v2
164217.7 Ops/sec
HTML Preparation code:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
Script Preparation code:
// deep copy: // String, Number, undefined, null, Set, Map, typed Array, Object, Boolean, RegExp, Date, ArrayBuffer // Functions, Properties of types: (Primitive, Symbol) // shallow copy (by reference): // WeakMap, WeakSet, Symbol function deepCopy(o) { if ((typeof o !== "object" || o === null) && !(o instanceof Function)) return o; // fast obj/null test let n, keys; const c = o.constructor; if (o[Symbol.iterator] instanceof Function) { // fast array test // Map and Set have no length property so they will be correctly constructed const l = o.length; n = (new c(l)); switch (c) { case Set: for (let e of o) n.add(deepCopy(e)); break; case Map: for (let [key, value] of o) n.set(key, deepCopy(value)); break; } for (let i of Object.keys(o)) n[i] = deepCopy(o[i]); } else { if (c !== Object) { switch (c) { case Function: let str = o.toString(); if(/ \[native code\] /.exec(str) === null){ let args=/^.*?\((.*?)\)/.exec(str)[1];//.split(/,/); let func=/^.*?{(.*)}/.exec(str)[1]; n=new c(args,func); }else{ n=o; } break; case RegExp: n = new c(o.valueOf()); break; case Date: n = new c(o); break; case ArrayBuffer: n = new c((new Int8Array(o)).length); break; default: n = o; } keys = Object.keys(o); } else { n = {}; keys = Object.getOwnPropertyNames(o); } for (let i of keys) n[i] = deepCopy(o[i]); } for (let i of Object.getOwnPropertySymbols(o)) n[i] = deepCopy(o[i]); return n; } function recursiveDeepCopy(obj) { return Object.keys(obj).reduce((v, d) => Object.assign(v, { [d]: (obj[d].constructor === Object) ? recursiveDeepCopy(obj[d]) : obj[d] }), {}); } function recursiveDeepCopy_v2(o) { var newO, i; if (typeof o !== 'object') { return o; } if (!o) { return o; } if ('[object Array]' === Object.prototype.toString.apply(o)) { newO = []; for (i = 0; i < o.length; i += 1) { newO[i] = recursiveDeepCopy_v2(o[i]); } return newO; } newO = {}; for (i in o) { if (o.hasOwnProperty(i)) { newO[i] = recursiveDeepCopy_v2(o[i]); } } return newO; } function jsonDeepCopy(o) { return JSON.parse(JSON.stringify(o)); } var dimensions = [{ "dimensions": [{ "runtime": { "common": { "client": null, "server": null } } }, { "device": { "android": null, "blackberry": null, "iemobile": null, "iphone": null, "ipad": null, "kindle": null, "opera-mini": null, "palm": null } }, { "environment": { "development": { "dev": null, "test": null }, "production": { "stage": null, "prod": null } } }, { "lang": { "ar": { "ar-JO": null, "ar-MA": null, "ar-SA": null, "ar-EG": null }, "bn": { "bn-IN": null }, "ca": { "ca-ES": null }, "cs": { "cs-CZ": null }, "da": { "da-DK": null }, "de": { "de-AT": null, "de-DE": null }, "el": { "el-GR": null }, "en": { "en-AU": null, "en-BG": null, "en-CA": null, "en-GB": null, "en-GY": null, "en-HK": null, "en-IE": null, "en-IN": null, "en-MY": null, "en-NZ": null, "en-PH": null, "en-SG": null, "en-US": null, "en-ZA": null }, "es": { "es-AR": null, "es-BO": null, "es-CL": null, "es-CO": null, "es-EC": null, "es-ES": null, "es-MX": null, "es-PE": null, "es-PY": null, "es-US": null, "es-UY": null, "es-VE": null }, "fi": { "fi-FI": null }, "fr": { "fr-BE": null, "fr-CA": null, "fr-FR": null, "fr-GF": null }, "hi": { "hi-IN": null }, "hu": { "hu-HU": null }, "id": { "id-ID": null }, "it": { "it-IT": null }, "ja": { "ja-JP": null }, "kn": { "kn-IN": null }, "ko": { "ko-KR": null }, "ml": { "ml-IN": null }, "mr": { "mr-IN": null }, "ms": { "ms-MY": null }, "nb": { "nb-NO": null }, "nl": { "nl-BE": null, "nl-NL": null, "nl-SR": null }, "pl": { "pl-PL": null }, "pt": { "pt-BR": null }, "ro": { "ro-RO": null }, "ru": { "ru-RU": null }, "sv": { "sv-SE": null }, "ta": { "ta-IN": null }, "te": { "te-IN": null }, "th": { "th-TH": null }, "tr": { "tr-TR": null }, "vi": { "vi-VN": null }, "zh": { "zh-Hans": { "zh-Hans-CN": null }, "zh-Hant": { "zh-Hant-HK": null, "zh-Hant-TW": null } } } }] }]
Tests:
Recursive Deep Copy
var dimensionsCopy = recursiveDeepCopy(dimensions);
JSON Deep Copy
var dimensionsCopy = jsonDeepCopy(dimensions);
lodash clone
var dimensionsCopy = _.cloneDeep(dimensions);
c7x43t
var dimensionsCopy = deepCopy(dimensions);
recursiveDeepCopy_v2
var dimensionsCopy = recursiveDeepCopy_v2(dimensions);