Benchmarks: fix workload function
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 20 Oct 2022 19:30:03 +0000 (21:30 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 20 Oct 2022 19:30:03 +0000 (21:30 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
.eslintrc.js
benchmarks/benchmarks-types.js [new file with mode: 0644]
benchmarks/benchmarks-utils.js
benchmarks/internal/cluster/worker.js
benchmarks/internal/thread/worker.js
benchmarks/versus-external-pools/functions/function-to-bench.js
benchmarks/versus-external-pools/package-lock.json
benchmarks/versus-external-pools/package.json

index 419b7e67a7b2ea3a1c71b0168ab87e50cb3dd566..59f0a1133f6abd76bba4543c75dfa10e861409d9 100644 (file)
@@ -36,6 +36,7 @@ module.exports = defineConfig({
       {
         skipWords: [
           'browserslist',
+          'builtins',
           'christopher',
           'cjs',
           'comparator',
diff --git a/benchmarks/benchmarks-types.js b/benchmarks/benchmarks-types.js
new file mode 100644 (file)
index 0000000..9138034
--- /dev/null
@@ -0,0 +1,7 @@
+const WorkerFunctions = {
+  jsonIntegerSerialization: 'jsonIntegerSerialization',
+  fibonacci: 'fibonacci',
+  factorial: 'factorial'
+}
+
+module.exports = { WorkerFunctions }
index 4e3cdc9c3af590c7e9812bf80abd81d3743155e8..30af25c927c38edc190ae2c5538a9c22e4569788 100644 (file)
@@ -1,8 +1,4 @@
-const WorkerFunctions = {
-  jsonIntegerSerialization: 'jsonIntegerSerialization',
-  fibonacci: 'fibonacci',
-  factorial: 'factorial'
-}
+const { WorkerFunctions } = require('./benchmarks-types')
 
 async function runPoolifierTest (pool, { tasks, workerData }) {
   return new Promise((resolve, reject) => {
index c64363de937c233972405e9473e7ddab80f5294b..926278be77e4484fbbd9200af2b48fa76db27f26 100644 (file)
@@ -1,10 +1,8 @@
 'use strict'
 const { isMaster } = require('cluster')
 const { ClusterWorker } = require('../../../lib/index')
-const {
-  WorkerFunctions,
-  executeWorkerFunction
-} = require('../../benchmarks-utils')
+const { executeWorkerFunction } = require('../../benchmarks-utils')
+const { WorkerFunctions } = require('../../benchmarks-types')
 
 const debug = false
 
index e84711ce6d024466d299f21093c7a4d518ca34f2..09060ebad46032264aea8dd3f60df085cba81b8c 100644 (file)
@@ -1,10 +1,8 @@
 'use strict'
 const { isMainThread } = require('worker_threads')
 const { ThreadWorker } = require('../../../lib/index')
-const {
-  WorkerFunctions,
-  executeWorkerFunction
-} = require('../../benchmarks-utils')
+const { executeWorkerFunction } = require('../../benchmarks-utils')
+const { WorkerFunctions } = require('../../benchmarks-types')
 
 const debug = false
 
index 2f75d143330a07adb22ff9b7bcbc8a9862ca1d55..89e9e2acae8c9d4fc09125fdde58090a50a1f4f7 100644 (file)
@@ -1,35 +1,47 @@
-const fs = require('fs')
-const {
-  WorkerFunctions,
-  executeWorkerFunction
-  // eslint-disable-next-line n/no-unpublished-require
-} = require('../../benchmarks-utils')
-
-const TaskTypes = {
-  CPU_INTENSIVE: 'CPU_INTENSIVE',
-  IO_INTENSIVE: 'IO_INTENSIVE'
-}
-
-module.exports = function (data) {
+/**
+ * The worker function to execute during pools benchmarks.
+ * NOTE: This function requires to be self-contained, thread-safe and re-entrant.
+ *
+ * @param {*} data The worker data.
+ * @returns {*} The result.
+ */
+function functionToBench (data) {
+  const fs = require('fs')
+  const TaskTypes = {
+    CPU_INTENSIVE: 'CPU_INTENSIVE',
+    IO_INTENSIVE: 'IO_INTENSIVE'
+  }
   data = data || {}
   data.taskType = data.taskType || TaskTypes.CPU_INTENSIVE
   data.taskSize = data.taskSize || 5000
-  const benchmarksFilePath = '/tmp/poolifier-benchmarks'
+  const baseDirectory = '/tmp/poolifier-benchmarks'
   switch (data.taskType) {
     case TaskTypes.CPU_INTENSIVE:
       // CPU intensive task
-      data.function = data.function || WorkerFunctions.jsonIntegerSerialization
-      executeWorkerFunction(data)
+      for (let i = 0; i < data.taskSize; i++) {
+        const o = {
+          a: i
+        }
+        JSON.stringify(o)
+      }
       return { ok: 1 }
     case TaskTypes.IO_INTENSIVE:
       // IO intensive task
+      if (fs.existsSync(baseDirectory) === false) {
+        fs.mkdirSync(baseDirectory, { recursive: true })
+      }
       for (let i = 0; i < data.taskSize; i++) {
-        fs.writeFileSync(benchmarksFilePath, i.toString(), 'utf8')
-        fs.readFileSync(benchmarksFilePath, 'utf8')
-        fs.unlinkSync(benchmarksFilePath)
+        const filePath = `${baseDirectory}/${i}`
+        fs.writeFileSync(filePath, i.toString(), {
+          encoding: 'utf8',
+          flag: 'a'
+        })
+        fs.readFileSync(filePath, 'utf8')
       }
       return { ok: 1 }
     default:
       throw new Error(`Unknown task type: ${data.taskType}`)
   }
 }
+
+module.exports = functionToBench
index 77e7497e0b50e42c264015b83279981f5791cb4d..3a506b6e8d95615268d8dd72acfa14b2c28dc830 100644 (file)
@@ -11,7 +11,7 @@
         "microjob": "0.7.0",
         "node-worker-threads-pool": "1.5.1",
         "piscina": "3.2.0",
-        "poolifier": "2.3.3",
+        "poolifier": "2.3.4",
         "threads": "1.7.0",
         "threadwork": "0.6.0",
         "worker-nodes": "2.4.0",
       }
     },
     "node_modules/poolifier": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/poolifier/-/poolifier-2.3.3.tgz",
-      "integrity": "sha512-mxkMpqPMHtdGeJfBe7iXRkIlcXJNYNuCPCw0sLhch8k7sFGGk0pby5eToGVwBx6Yxc0o7aCR5JU1blnFLl8Igg==",
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/poolifier/-/poolifier-2.3.4.tgz",
+      "integrity": "sha512-kb5VsjkMxLPJagJmwnlv5bSe87O2V3hIPLAJLvmDlMoo9+2bqFLxCsxz+suC+sQyHxiLw97QL6pR1+oBVAq2Lg==",
       "engines": {
         "node": ">=16.0.0",
         "npm": ">=8.0.0"
       }
     },
     "poolifier": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/poolifier/-/poolifier-2.3.3.tgz",
-      "integrity": "sha512-mxkMpqPMHtdGeJfBe7iXRkIlcXJNYNuCPCw0sLhch8k7sFGGk0pby5eToGVwBx6Yxc0o7aCR5JU1blnFLl8Igg=="
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/poolifier/-/poolifier-2.3.4.tgz",
+      "integrity": "sha512-kb5VsjkMxLPJagJmwnlv5bSe87O2V3hIPLAJLvmDlMoo9+2bqFLxCsxz+suC+sQyHxiLw97QL6pR1+oBVAq2Lg=="
     },
     "threads": {
       "version": "1.7.0",
index 10e566b2dd39d9d83424a2a50fa7a9afa6087685..b51245cdc43f979b154e083f306a66bc54682399 100644 (file)
@@ -12,7 +12,7 @@
     "microjob": "0.7.0",
     "node-worker-threads-pool": "1.5.1",
     "piscina": "3.2.0",
-    "poolifier": "2.3.3",
+    "poolifier": "2.3.4",
     "threads": "1.7.0",
     "threadwork": "0.6.0",
     "worker-nodes": "2.4.0",