add deep merge benchmark
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 28 Jul 2023 14:31:10 +0000 (16:31 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 28 Jul 2023 14:31:10 +0000 (16:31 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
deep-clone-object.mjs
deep-merge-object.mjs [new file with mode: 0644]
package.json
pnpm-lock.yaml

index be98817da7967080ecec8d95b60e1a8edb3be266..8206cd9948a0997160f7986193939d74ca001e7a 100644 (file)
@@ -10,19 +10,19 @@ const object = generateRandomObject()
 Benchmark.suite(
   `Deep clone object with ${Object.keys(object).length} keys`,
   Benchmark.add('JSON stringify/parse', (obj = object) => {
-    const objClone = JSON.parse(JSON.stringify(obj))
+    const objCloned = JSON.parse(JSON.stringify(obj))
   }),
   Benchmark.add('structuredClone', (obj = object) => {
-    const objClone = structuredClone(obj)
+    const objCloned = structuredClone(obj)
   }),
   Benchmark.add('lodash cloneDeep', (obj = object) => {
-    const objClone = _.cloneDeep(obj)
+    const objCloned = _.cloneDeep(obj)
   }),
   Benchmark.add('just-clone', (obj = object) => {
-    const objClone = clone(obj)
+    const objCloned = clone(obj)
   }),
   Benchmark.add('deep-clone', (obj = object) => {
-    const objClone = deepClone(obj)
+    const objCloned = deepClone(obj)
   }),
   Benchmark.cycle(),
   Benchmark.complete(),
diff --git a/deep-merge-object.mjs b/deep-merge-object.mjs
new file mode 100644 (file)
index 0000000..036f4f0
--- /dev/null
@@ -0,0 +1,43 @@
+/* eslint-disable no-unused-vars */
+import Benchmark from 'benny'
+import _ from 'lodash'
+import merge from 'just-merge'
+import deepMerge from 'deepmerge'
+import { generateRandomObject } from './benchmark-utils.mjs'
+
+const object = generateRandomObject()
+const objectToMerge = generateRandomObject()
+
+Benchmark.suite(
+  `Deep merge two objects: object with ${
+    Object.keys(object).length
+  } keys, object with ${Object.keys(objectToMerge).length} keys`,
+  Benchmark.add('lodash merge', (obj = object) => {
+    const objMerged = _.merge(obj, objectToMerge)
+  }),
+  Benchmark.add('just-merge', (obj = object) => {
+    const objMerged = merge(obj, objectToMerge)
+  }),
+  Benchmark.add('deep-clone', (obj = object) => {
+    const objMerged = deepMerge(obj, objectToMerge)
+  }),
+  Benchmark.cycle(),
+  Benchmark.complete(),
+  Benchmark.save({
+    file: 'deep-merge-object',
+    format: 'json',
+    details: true
+  }),
+  Benchmark.save({
+    file: 'deep-merge-object',
+    format: 'chart.html',
+    details: true
+  }),
+  Benchmark.save({
+    file: 'deep-merge-object',
+    format: 'table.html',
+    details: true
+  })
+).catch(err => {
+  console.error(err)
+})
index 2573d225007e3a8a393986539401422ad7a66f53..0ae5744209ec245893031e7bef3bf0360a61c9b8 100644 (file)
@@ -35,6 +35,7 @@
     "benchmark:busy-wait": "node busy-wait.mjs",
     "benchmark:empty-array": "node empty-array.mjs",
     "benchmark:deep-clone-object": "node deep-clone-object.mjs",
+    "benchmark:deep-merge-object": "node deep-merge-object.mjs",
     "benchmark:shallow-clone-object": "node shallow-clone-object.mjs",
     "benchmark:is-empty-object": "node is-empty-object.mjs",
     "benchmark:is-undefined": "node is-undefined.mjs",
@@ -54,7 +55,9 @@
   "dependencies": {
     "benny": "^3.7.1",
     "deep-clone": "^4.0.0",
+    "deepmerge": "^4.3.1",
     "just-clone": "^6.2.0",
+    "just-merge": "^3.2.0",
     "lodash": "^4.17.21",
     "microtime": "^3.1.1",
     "uuid": "^9.0.0"
index e50c2b0cb1043d49f1e54e4ab92b3b14a120a55f..c7ecf4fe251d80777213270a6ac9d4bd20bf0598 100644 (file)
@@ -14,9 +14,15 @@ dependencies:
   deep-clone:
     specifier: ^4.0.0
     version: 4.0.0
+  deepmerge:
+    specifier: ^4.3.1
+    version: 4.3.1
   just-clone:
     specifier: ^6.2.0
     version: 6.2.0
+  just-merge:
+    specifier: ^3.2.0
+    version: 3.2.0
   lodash:
     specifier: ^4.17.21
     version: 4.17.21
@@ -518,6 +524,11 @@ packages:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
 
+  /deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
   /define-properties@1.2.0:
     resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
     engines: {node: '>= 0.4'}
@@ -1473,6 +1484,10 @@ packages:
     resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==}
     dev: false
 
+  /just-merge@3.2.0:
+    resolution: {integrity: sha512-cNh5FWt44hx4SpQS1xZU8Tzr/fQA69pqCdjbwxmaYYIOuRfA8EIg+dn1bGmIW03ZUtR2vkMOCjWKc+jIbpauSw==}
+    dev: false
+
   /kleur@4.1.5:
     resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
     engines: {node: '>=6'}