Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
javascript deep clone benchmark
(version: 0)
Comparing performance of:
Lodash CloneDeep vs Json Clone vs recursiveDeepCopy vs clone
Created:
6 years ago
by:
Guest
Jump to the latest result
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...' }, regularMarkets: { 1: { markets: [ {id: "", sortOrder: 10100, label: "Match Result --- 2"}, {id: "", sortOrder: 10100, label: "Match Result"} ] }, 2: { markets: [ {id: "", sortOrder: 20200, label: "Both Teams to Score --- 2"}, {id: "", sortOrder: 20200, label: "Both Teams to Score"} ] }, 3: { markets: [ {id: "", sortOrder: 30300, label: "Draw no Bet --- 2"}, {id: "", sortOrder: 30300, label: "Draw no Bet"} ] }, 4: { markets: [ {id: "", sortOrder: 40400, label: "Double Chance --- 2"}, {id: "", sortOrder: 40400, label: "Double Chance"} ] }, 5: { markets: [ {id: "", sortOrder: 50500, label: "3-way Handicap --- 2"}, {id: "", sortOrder: 50500, label: "3-way Handicap"} ] }, 6: { marketGroupId: "01" }, 15: { markets: [ {id: "", sortOrder: 151501.5, label: "Match Goals | 1.5"}, {id: "", sortOrder: 151502.5, label: "Match Goals | 2.5"}, {id: "", sortOrder: 151503.5, label: "Match Goals | 3.5"} ] }, 20: { marketGroupId: "05" }, 60: { markets: [ {id: "", sortOrder: 606000, label: "Odd/Even number of Goals"} ] } }, groupedMarkets: { 05: { grouping: { 10: { grouping: { N5MTCO: { grouping: {}, markets: [ {id: "", sortOrder: 210101.5, label: "Next 5 mins (10:00 - 14:59) | Total Corners | 1.5"}, {id: "", sortOrder: 210202.5, label: "Next 5 mins (10:00 - 14:59) | Total Corners | 2.5"}, {id: "", sortOrder: 210303.5, label: "Next 5 mins (10:00 - 14:59) | Total Corners | 3.5"} ] }, N5MTTI: { grouping: {}, markets: [ {id: "", sortOrder: 200101.5, label: "Next 5 mins (10:00 - 14:59) | Total Throw Ins | 1.5"}, {id: "", sortOrder: 200202.5, label: "Next 5 mins (10:00 - 14:59) | Total Throw Ins | 2.5"}, {id: "", sortOrder: 200303.5, label: "Next 5 mins (10:00 - 14:59) | Total Throw Ins | 3.5"} ] }, N5MTC: { grouping: {}, markets: [ {id: "", sortOrder: 220202.5, label: "Next 5 mins (10:00 - 14:59) | Total Cards | 2.5"}, {id: "", sortOrder: 220303.5, label: "Next 5 mins (10:00 - 14:59) | Total Cards | 3.5"}, {id: "", sortOrder: 220404.5, label: "Next 5 mins (10:00 - 14:59) | Total Cards | 4.5"} ] } }, marketGroupSortOrder: [ {group: "N5MTTI", sort: 20}, {group: "N5MTCO", sort: 21}, {group: "N5MTC", sort: 22} ] }, 05: { grouping: { N5MTCO: { grouping: {}, markets: [ {id: "", sortOrder: 210101.5, label: "Next 5 mins (05:00 - 09:59) | Total Corners | 1.5"}, {id: "", sortOrder: 210202.5, label: "Next 5 mins (05:00 - 09:59) | Total Corners | 2.5"}, {id: "", sortOrder: 210303.5, label: "Next 5 mins (05:00 - 09:59) | Total Corners | 3.5"} ] }, N5MTTI: { grouping: {}, markets: [ {id: "", sortOrder: 200101.5, label: "Next 5 mins (05:00 - 09:59) | Total Throw Ins | 1.5"}, {id: "", sortOrder: 200202.5, label: "Next 5 mins (05:00 - 09:59) | Total Throw Ins | 2.5"}, {id: "", sortOrder: 200303.5, label: "Next 5 mins (05:00 - 09:59) | Total Throw Ins | 3.5"} ] }, N5MTC: { grouping: {}, markets: [ {id: "", sortOrder: 220202.5, label: "Next 5 mins (05:00 - 09:59) | Total Cards | 2.5"}, {id: "", sortOrder: 220303.5, label: "Next 5 mins (05:00 - 09:59) | Total Cards | 3.5"}, {id: "", sortOrder: 220404.5, label: "Next 5 mins (05:00 - 09:59) | Total Cards | 4.5"} ] } }, marketGroupSortOrder: [ {group: "N5MTTI", sort: 20}, {group: "N5MTCO", sort: 21}, {group: "N5MTC", sort: 22} ] } }, sortOrder: 20, marketGroupSortOrder: [ {group: "05", sort: 5}, {group: "10", sort: 10} ] }, 01: { grouping: { 10: { grouping: { N1MTIA: { grouping: {}, markets: [ {id: "", sortOrder: 80800, label: "Next 1 min (10:00 - 10:59) | Throw In Awarded"} ] }, N1MGKA: { grouping: {}, markets: [ {id: "", sortOrder: 60600, label: "Next 1 min (10:00 - 10:59) | Goal Kick Awarded"} ] }, N1MFKA: { grouping: {}, markets: [ {id: "", sortOrder: 70700, label: "Next 1 min (10:00 - 10:59) | Free Kick Awarded"} ] } }, marketGroupSortOrder: [ {group: "N1MGKA", sort: 6}, {group: "N1MFKA", sort: 7}, {group: "N1MTIA", sort: 8} ] }, 11: { grouping: { N1MGKA: { grouping: {}, markets: [ {id: "", sortOrder: 60600, label: "Next 1 min (11:00 - 10:59) | Goal Kick Awarded"} ] }, N1MTIA: { grouping: {}, markets: [ {id: "", sortOrder: 80800, label: "Next 1 min (11:00 - 10:59) | Throw In Awarded"} ] }, N1MFKA: { grouping: {}, markets: [ {id: "", sortOrder: 70700, label: "Next 1 min (11:00 - 10:59) | Free Kick Awarded"} ] }, }, marketGroupSortOrder: [ {group: "N1MGKA", sort: 6}, {group: "N1MFKA", sort: 7}, {group: "N1MTIA", sort: 8} ] }, 08: { grouping: { N1MFKA: { grouping: {}, markets: [ {id: "", sortOrder: 70700, label: "Next 1 min (08:00 - 08:59) | Free Kick Awarded"} ] }, N1MTIA: { grouping: {}, markets: [ {id: "", sortOrder: 80800, label: "Next 1 min (08:00 - 08:59) | Throw In Awarded"} ] }, N1MGKA: { grouping: {}, markets: [ {id: "", sortOrder: 60600, label: "Next 1 min (08:00 - 08:59) | Goal Kick Awarded"} ] } }, marketGroupSortOrder: [ {group: "N1MGKA", sort: 6}, {group: "N1MFKA", sort: 7}, {group: "N1MTIA", sort: 8} ] }, 09: { grouping: { N1MTIA: { grouping: {}, markets: [ {id: "", sortOrder: 80800, label: "Next 1 min (09:00 - 09:59) | Throw In Awarded"} ] }, N1MGKA: { grouping: {}, markets: [ {id: "", sortOrder: 60600, label: "Next 1 min (09:00 - 09:59) | Goal Kick Awarded"} ] }, N1MFKA: { grouping: {}, markets: [ {id: "", sortOrder: 70700, label: "Next 1 min (09:00 - 09:59) | Free Kick Awarded"} ] } }, marketGroupSortOrder: [ {group: "N1MGKA", sort: 6}, {group: "N1MFKA", sort: 7}, {group: "N1MTIA", sort: 8} ] } }, sortOrder: 6, marketGroupSortOrder: [ {group: "08", sort: 8}, {group: "09", sort: 9}, {group: "10", sort: 10}, {group: "11", sort: 11} ] } } } var myCopy = null; function clone(obj) { if(obj === null || typeof obj !== 'object') return obj; var target = obj instanceof Array ? [] : {}; for (var i in obj) { target[i] = clone(obj[i]); } return target; } function recursiveDeepCopy(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(o[i]); } return newO; } newO = {}; for (i in o) { if (o.hasOwnProperty(i)) { newO[i] = recursiveDeepCopy(o[i]); } } return newO; }
Tests:
Lodash CloneDeep
myCopy = _.cloneDeep(MyObject);
Json Clone
myCopy = JSON.parse(JSON.stringify(MyObject));
recursiveDeepCopy
myCopy = recursiveDeepCopy(MyObject);
clone
myCopy = clone(MyObject);
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (4)
Previous results
Fork
Test case name
Result
Lodash CloneDeep
Json Clone
recursiveDeepCopy
clone
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
2 years ago
)
User agent:
Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Browser/OS:
Firefox 115 on Linux
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
Lodash CloneDeep
7500.8 Ops/sec
Json Clone
19586.9 Ops/sec
recursiveDeepCopy
63128.5 Ops/sec
clone
32563.9 Ops/sec
Autogenerated LLM Summary
(model
llama3.1:latest
, generated one year ago):
Based on the provided test cases and benchmark results, here are some observations: 1. **recursiveDeepCopy**: This function has the highest execution speed (63128.45703125 EPS) among all test cases. It's designed specifically for deep copying objects, making it efficient in this scenario. 2. **clone**: The clone function is also quite fast (32563.896484375 EPS), which is impressive considering its simplicity and the fact that it only clones arrays or objects, not deeply nested ones like recursiveDeepCopy handles. 3. **Json Clone**: JSON parsing and stringifying has a lower execution speed (19586.869140625 EPS) compared to clone and recursiveDeepCopy. This might be due to the overhead of converting data types (e.g., dates, functions), which is inherent in the JSON cloning process but not in the custom implementations. 4. **Lodash CloneDeep**: Lodash's cloneDeep function has the lowest execution speed (7500.8232421875 EPS) among all test cases. While it provides robustness and handles complex scenarios, its overhead might be due to the extensive feature set of Lodash and the need for it to support a wide range of data structures. **Conclusion**: Based on these results, if you're looking for a high-performance deep cloning solution with minimal overhead, either `recursiveDeepCopy` or `clone` could be suitable choices. However, if you require robustness in handling complex data types and a more comprehensive feature set, Lodash's cloneDeep might still be the better option, despite its lower performance. How would you like me to proceed?
Related benchmarks:
Object.assign vs. JSON String/Parse with large-ish data
cloneDeep vs JSON.*
deepcopy vs splice 2
Deep cloning of arrays with objects
Comments
Confirm delete:
Do you really want to delete benchmark?