Switch internal benchmarking code to benny.
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 24 Oct 2022 10:43:45 +0000 (12:43 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 24 Oct 2022 10:43:45 +0000 (12:43 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
.eslintrc.js
.gitignore
CHANGELOG.md
benchmarks/benchmarks-utils.js
benchmarks/internal/bench.js
benchmarks/worker-selection/lru.js
benchmarks/worker-selection/round-robin.js
package-lock.json
package.json

index f0f371e0ff772cb761ed8288ed1df6e50993c131..fd8a538debf25f98ba377117efa8caf9fd582e72 100644 (file)
@@ -34,6 +34,7 @@ module.exports = defineConfig({
       'warn',
       {
         skipWords: [
+          'benny',
           'browserslist',
           'builtins',
           'christopher',
index 99b9a2c2fef7c56ee9b60e9c04cfccd687666eb0..a1a9fd96930e6b04e312da11c827fb72fa9ed657 100644 (file)
@@ -73,4 +73,5 @@ build/config.gypi
 .scannerwork
 *.bak
 lib
-reports
+reports/
+benchmarks/internal/results/
index e4fbb015642b0c765541eee10472fae516c5615b..87c1784443d09fe389ea10084827727bc6d1b158 100644 (file)
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Changed
+
+- Switch internal benchmarking code to benny.
+
 ## [2.3.7] - 2022-10-23
 
 ### Changed
index 30af25c927c38edc190ae2c5538a9c22e4569788..62613c7e877308195871675021cc23cbba700a06 100644 (file)
@@ -9,7 +9,7 @@ async function runPoolifierTest (pool, { tasks, workerData }) {
         .then(() => {
           executions++
           if (executions === tasks) {
-            return resolve('FINISH')
+            return resolve({ ok: 1 })
           }
           return null
         })
@@ -77,13 +77,7 @@ function executeWorkerFunction (data) {
   }
 }
 
-const LIST_FORMATTER = new Intl.ListFormat('en-US', {
-  style: 'long',
-  type: 'conjunction'
-})
-
 module.exports = {
-  LIST_FORMATTER,
   WorkerFunctions,
   executeWorkerFunction,
   generateRandomInteger,
index f3a1eb4fda07db3328704cf300f2afb1707a91f4..faf093936a9fedf099607e17ca002310f108ef1d 100644 (file)
@@ -1,4 +1,4 @@
-const Benchmark = require('benchmark')
+const Benchmark = require('benny')
 const {
   dynamicClusterTest,
   dynamicClusterTestFairShare,
@@ -23,77 +23,81 @@ const {
   fixedThreadTestLessRecentlyUsed,
   fixedThreadTestWeightedRoundRobin
 } = require('./thread/fixed')
-const { LIST_FORMATTER } = require('../benchmarks-utils')
 
-const suite = new Benchmark.Suite('poolifier')
+const resultsFile = 'poolifier'
+const resultsFolder = 'benchmarks/internal/results'
 
-// Wait some seconds before start, pools need to load threads !!!
-setTimeout(async () => {
-  test()
-}, 3000)
-
-async function test () {
-  // Add tests
-  suite
-    .add('Poolifier:Fixed:ThreadPool', async function () {
-      await fixedThreadTest()
-    })
-    .add('Poolifier:Fixed:ThreadPool:LessRecentlyUsed', async function () {
-      await fixedThreadTestLessRecentlyUsed()
-    })
-    .add('Poolifier:Fixed:ThreadPool:WeightedRoundRobin', async function () {
-      await fixedThreadTestWeightedRoundRobin()
-    })
-    .add('Poolifier:Fixed:ThreadPool:FairShare', async function () {
-      await fixedThreadTestFairShare()
-    })
-    .add('Poolifier:Dynamic:ThreadPool', async function () {
-      await dynamicThreadTest()
-    })
-    .add('Poolifier:Dynamic:ThreadPool:LessRecentlyUsed', async function () {
-      await dynamicThreadTestLessRecentlyUsed()
-    })
-    .add('Poolifier:Dynamic:ThreadPool:WeightedRoundRobin', async function () {
-      await dynamicThreadTestWeightedRoundRobin()
-    })
-    .add('Poolifier:Dynamic:ThreadPool:FairShare', async function () {
-      await dynamicThreadTestFairShare()
-    })
-    .add('Poolifier:Fixed:ClusterPool', async function () {
-      await fixedClusterTest()
-    })
-    .add('Poolifier:Fixed:ClusterPool:LessRecentlyUsed', async function () {
-      await fixedClusterTestLessRecentlyUsed()
-    })
-    .add('Poolifier:Fixed:ClusterPool:WeightedRoundRobin', async function () {
-      await fixedClusterTestWeightedRoundRobin
-    })
-    .add('Poolifier:Fixed:ClusterPool:FairShare', async function () {
-      await fixedClusterTestFairShare()
-    })
-    .add('Poolifier:Dynamic:ClusterPool', async function () {
-      await dynamicClusterTest()
-    })
-    .add('Poolifier:Dynamic:ClusterPool:LessRecentlyUsed', async function () {
-      await dynamicClusterTestLessRecentlyUsed()
-    })
-    .add('Poolifier:Dynamic:ClusterPool:WeightedRoundRobin', async function () {
+Benchmark.suite(
+  'Poolifier',
+  Benchmark.add('Poolifier:Fixed:ThreadPool', async () => {
+    await fixedThreadTest()
+  }),
+  Benchmark.add('Poolifier:Fixed:ThreadPool:LessRecentlyUsed', async () => {
+    await fixedThreadTestLessRecentlyUsed()
+  }),
+  Benchmark.add('Poolifier:Fixed:ThreadPool:WeightedRoundRobin', async () => {
+    await fixedThreadTestWeightedRoundRobin()
+  }),
+  Benchmark.add('Poolifier:Fixed:ThreadPool:FairShare', async () => {
+    await fixedThreadTestFairShare()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ThreadPool', async () => {
+    await dynamicThreadTest()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ThreadPool:LessRecentlyUsed', async () => {
+    await dynamicThreadTestLessRecentlyUsed()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ThreadPool:WeightedRoundRobin', async () => {
+    await dynamicThreadTestWeightedRoundRobin()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ThreadPool:FairShare', async () => {
+    await dynamicThreadTestFairShare()
+  }),
+  Benchmark.add('Poolifier:Fixed:ClusterPool', async () => {
+    await fixedClusterTest()
+  }),
+  Benchmark.add('Poolifier:Fixed:ClusterPool:LessRecentlyUsed', async () => {
+    await fixedClusterTestLessRecentlyUsed()
+  }),
+  Benchmark.add('Poolifier:Fixed:ClusterPool:WeightedRoundRobin', async () => {
+    await fixedClusterTestWeightedRoundRobin
+  }),
+  Benchmark.add('Poolifier:Fixed:ClusterPool:FairShare', async () => {
+    await fixedClusterTestFairShare()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ClusterPool', async () => {
+    await dynamicClusterTest()
+  }),
+  Benchmark.add('Poolifier:Dynamic:ClusterPool:LessRecentlyUsed', async () => {
+    await dynamicClusterTestLessRecentlyUsed()
+  }),
+  Benchmark.add(
+    'Poolifier:Dynamic:ClusterPool:WeightedRoundRobin',
+    async () => {
       await dynamicClusterTestWeightedRoundRobin
-    })
-    .add('Poolifier:Dynamic:ClusterPool:FairShare', async function () {
-      await dynamicClusterTestFairShare()
-    })
-    // Add listeners
-    .on('cycle', function (event) {
-      console.log(event.target.toString())
-    })
-    .on('complete', function () {
-      console.log(
-        'Fastest is ' +
-          LIST_FORMATTER.format(this.filter('fastest').map('name'))
-      )
-      // eslint-disable-next-line n/no-process-exit
-      process.exit()
-    })
-    .run({ async: true })
-}
+    }
+  ),
+  Benchmark.add('Poolifier:Dynamic:ClusterPool:FairShare', async () => {
+    await dynamicClusterTestFairShare()
+  }),
+  Benchmark.cycle(),
+  Benchmark.complete(),
+  Benchmark.save({
+    file: resultsFile,
+    folder: resultsFolder,
+    format: 'json',
+    details: true
+  }),
+  Benchmark.save({
+    file: resultsFile,
+    folder: resultsFolder,
+    format: 'chart.html',
+    details: true
+  }),
+  Benchmark.save({
+    file: resultsFile,
+    folder: resultsFolder,
+    format: 'table.html',
+    details: true
+  })
+)
index e60c84154f946da340ed27b98ca4e78274ca2d2c..90628d3ad9d877d1002fa2df384c9f42cb890bb5 100644 (file)
@@ -1,7 +1,5 @@
-const Benchmark = require('benchmark')
-const { generateRandomInteger, LIST_FORMATTER } = require('../benchmarks-utils')
-
-const suite = new Benchmark.Suite()
+const Benchmark = require('benny')
+const { generateRandomInteger } = require('../benchmarks-utils')
 
 function generateRandomTasksMap (
   numberOfWorkers,
@@ -169,41 +167,26 @@ function quickSelectRecursionRandomPivot (tasksMap) {
   )
 }
 
-// console.log(Array.from(tasksMap))
-// console.log(loopSelect(tasksMap))
-// console.log(arraySortSelect(tasksMap))
-// console.log(quickSelectLoop(tasksMap))
-// console.log(quickSelectLoopRandomPivot(tasksMap))
-// console.log(quickSelectRecursion(tasksMap))
-// console.log(quickSelectRecursionRandomPivot(tasksMap))
-
-suite
-  .add('Loop select', function () {
+Benchmark.suite(
+  'Tasks selection',
+  Benchmark.add('Loop select', () => {
     loopSelect(tasksMap)
-  })
-  .add('Array sort select', function () {
+  }),
+  Benchmark.add('Array sort select', () => {
     arraySortSelect(tasksMap)
-  })
-  .add('Quick select loop', function () {
+  }),
+  Benchmark.add('Quick select loop', () => {
     quickSelectLoop(tasksMap)
-  })
-  .add('Quick select loop with random pivot', function () {
+  }),
+  Benchmark.add('Quick select loop with random pivot', () => {
     quickSelectLoopRandomPivot(tasksMap)
-  })
-  .add('Quick select recursion', function () {
+  }),
+  Benchmark.add('Quick select recursion', () => {
     quickSelectRecursion(tasksMap)
-  })
-  .add('Quick select recursion with random pivot', function () {
+  }),
+  Benchmark.add('Quick select recursion with random pivot', () => {
     quickSelectRecursionRandomPivot(tasksMap)
-  })
-  .on('cycle', function (event) {
-    console.log(event.target.toString())
-  })
-  .on('complete', function () {
-    console.log(
-      'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
-    )
-    // eslint-disable-next-line n/no-process-exit
-    process.exit()
-  })
-  .run()
+  }),
+  Benchmark.cycle(),
+  Benchmark.complete()
+)
index 0e391a988674ec0fb0337acc87715de484b97f28..0b8b9ec23de9d3d49c753e4aa81914d0940fa84b 100644 (file)
@@ -1,7 +1,4 @@
-const Benchmark = require('benchmark')
-const { LIST_FORMATTER } = require('../benchmarks-utils')
-
-const suite = new Benchmark.Suite()
+const Benchmark = require('benny')
 
 function generateWorkersArray (numberOfWorkers) {
   return [...Array(numberOfWorkers).keys()]
@@ -39,31 +36,24 @@ function roundRobinIncrementModulo () {
   return chosenWorker
 }
 
-suite
-  .add('Ternary off by one', function () {
+Benchmark.suite(
+  'Less recently used',
+  Benchmark.add('Ternary off by one', () => {
     nextWorkerIndex = 0
     roundRobinTernaryOffByOne()
-  })
-  .add('Ternary with negation', function () {
+  }),
+  Benchmark.add('Ternary with negation', () => {
     nextWorkerIndex = 0
     roundRobinTernaryWithNegation()
-  })
-  .add('Ternary with pre-choosing', function () {
+  }),
+  Benchmark.add('Ternary with pre-choosing', () => {
     nextWorkerIndex = 0
     roundRobinTernaryWithPreChoosing()
-  })
-  .add('Increment+Modulo', function () {
+  }),
+  Benchmark.add('Increment+Modulo', () => {
     nextWorkerIndex = 0
     roundRobinIncrementModulo()
-  })
-  .on('cycle', function (event) {
-    console.log(event.target.toString())
-  })
-  .on('complete', function () {
-    console.log(
-      'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
-    )
-    // eslint-disable-next-line n/no-process-exit
-    process.exit()
-  })
-  .run()
+  }),
+  Benchmark.cycle(),
+  Benchmark.complete()
+)
index 99f512b7d298e3151942dc7c755de48b57034380..b8be83561e2402cc3b31fd5271998a0e66e5d566 100644 (file)
@@ -13,7 +13,7 @@
         "@types/node": "^18.11.3",
         "@typescript-eslint/eslint-plugin": "^5.40.1",
         "@typescript-eslint/parser": "^5.40.1",
-        "benchmark": "^2.1.4",
+        "benny": "^3.7.1",
         "c8": "^7.12.0",
         "eslint": "^8.26.0",
         "eslint-config-standard": "^17.0.0",
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@arrows/array": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz",
+      "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==",
+      "dev": true,
+      "dependencies": {
+        "@arrows/composition": "^1.2.2"
+      }
+    },
+    "node_modules/@arrows/composition": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz",
+      "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==",
+      "dev": true
+    },
+    "node_modules/@arrows/dispatch": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz",
+      "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==",
+      "dev": true,
+      "dependencies": {
+        "@arrows/composition": "^1.2.2"
+      }
+    },
+    "node_modules/@arrows/error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz",
+      "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==",
+      "dev": true
+    },
+    "node_modules/@arrows/multimethod": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.4.1.tgz",
+      "integrity": "sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ==",
+      "dev": true,
+      "dependencies": {
+        "@arrows/array": "^1.4.1",
+        "@arrows/composition": "^1.2.2",
+        "@arrows/error": "^1.0.2",
+        "fast-deep-equal": "^3.1.3"
+      }
+    },
     "node_modules/@babel/code-frame": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "18.11.3",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
-      "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==",
+      "version": "18.11.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz",
+      "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==",
       "dev": true
     },
     "node_modules/@types/object-path": {
         "platform": "^1.3.3"
       }
     },
+    "node_modules/benny": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.1.tgz",
+      "integrity": "sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA==",
+      "dev": true,
+      "dependencies": {
+        "@arrows/composition": "^1.0.0",
+        "@arrows/dispatch": "^1.0.2",
+        "@arrows/multimethod": "^1.1.6",
+        "benchmark": "^2.1.4",
+        "common-tags": "^1.8.0",
+        "fs-extra": "^10.0.0",
+        "json2csv": "^5.0.6",
+        "kleur": "^4.1.4",
+        "log-update": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
         "node": ">= 12.0.0"
       }
     },
+    "node_modules/common-tags": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
     "node_modules/compatfactory": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-1.0.1.tgz",
       "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
       "dev": true
     },
+    "node_modules/json2csv": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz",
+      "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==",
+      "dev": true,
+      "dependencies": {
+        "commander": "^6.1.0",
+        "jsonparse": "^1.3.1",
+        "lodash.get": "^4.4.2"
+      },
+      "bin": {
+        "json2csv": "bin/json2csv.js"
+      },
+      "engines": {
+        "node": ">= 10",
+        "npm": ">= 6.13.0"
+      }
+    },
+    "node_modules/json2csv/node_modules/commander": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/json5": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
         "graceful-fs": "^4.1.6"
       }
     },
+    "node_modules/jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+      "dev": true,
+      "engines": [
+        "node >= 0.2.0"
+      ]
+    },
     "node_modules/jsx-ast-utils": {
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
         "json-buffer": "3.0.1"
       }
     },
+    "node_modules/kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/latest-version": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
         "@jridgewell/trace-mapping": "^0.3.9"
       }
     },
+    "@arrows/array": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz",
+      "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==",
+      "dev": true,
+      "requires": {
+        "@arrows/composition": "^1.2.2"
+      }
+    },
+    "@arrows/composition": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz",
+      "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==",
+      "dev": true
+    },
+    "@arrows/dispatch": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz",
+      "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==",
+      "dev": true,
+      "requires": {
+        "@arrows/composition": "^1.2.2"
+      }
+    },
+    "@arrows/error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz",
+      "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==",
+      "dev": true
+    },
+    "@arrows/multimethod": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.4.1.tgz",
+      "integrity": "sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ==",
+      "dev": true,
+      "requires": {
+        "@arrows/array": "^1.4.1",
+        "@arrows/composition": "^1.2.2",
+        "@arrows/error": "^1.0.2",
+        "fast-deep-equal": "^3.1.3"
+      }
+    },
     "@babel/code-frame": {
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
       "dev": true
     },
     "@types/node": {
-      "version": "18.11.3",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
-      "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==",
+      "version": "18.11.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz",
+      "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==",
       "dev": true
     },
     "@types/object-path": {
         "platform": "^1.3.3"
       }
     },
+    "benny": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.1.tgz",
+      "integrity": "sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA==",
+      "dev": true,
+      "requires": {
+        "@arrows/composition": "^1.0.0",
+        "@arrows/dispatch": "^1.0.2",
+        "@arrows/multimethod": "^1.1.6",
+        "benchmark": "^2.1.4",
+        "common-tags": "^1.8.0",
+        "fs-extra": "^10.0.0",
+        "json2csv": "^5.0.6",
+        "kleur": "^4.1.4",
+        "log-update": "^4.0.0"
+      }
+    },
     "binary-extensions": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
       "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
       "dev": true
     },
+    "common-tags": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+      "dev": true
+    },
     "compatfactory": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/compatfactory/-/compatfactory-1.0.1.tgz",
       "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
       "dev": true
     },
+    "json2csv": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz",
+      "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==",
+      "dev": true,
+      "requires": {
+        "commander": "^6.1.0",
+        "jsonparse": "^1.3.1",
+        "lodash.get": "^4.4.2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+          "dev": true
+        }
+      }
+    },
     "json5": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
         "universalify": "^2.0.0"
       }
     },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+      "dev": true
+    },
     "jsx-ast-utils": {
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
         "json-buffer": "3.0.1"
       }
     },
+    "kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "dev": true
+    },
     "latest-version": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
index 0561bb507ba225bcdcc6a51db21d812d737c6f80..1583b56c2b007c7e54e5850fe14b44d53699815d 100644 (file)
@@ -83,7 +83,7 @@
     "@types/node": "^18.11.3",
     "@typescript-eslint/eslint-plugin": "^5.40.1",
     "@typescript-eslint/parser": "^5.40.1",
-    "benchmark": "^2.1.4",
+    "benny": "^3.7.1",
     "c8": "^7.12.0",
     "eslint": "^8.26.0",
     "eslint-config-standard": "^17.0.0",