test: refine benchmark configuration
[poolifier.git] / benchmarks / internal / bench.mjs
index 2749da428bfcda15d881b0f934d35b54f8a603f2..c20b011f22afe762c36cde0ad6e7a1340586b170 100644 (file)
@@ -1,93 +1,66 @@
-import { add, complete, cycle, save, suite } from 'benny'
+import assert from 'node:assert'
+import Benchmark from 'benchmark'
 import {
-  Measurements,
   PoolTypes,
   WorkerChoiceStrategies,
   WorkerTypes,
   availableParallelism
 } from '../../lib/index.mjs'
 import { TaskFunctions } from '../benchmarks-types.mjs'
-import { buildPool, runTest } from '../benchmarks-utils.mjs'
+import {
+  LIST_FORMATTER,
+  buildPoolifierPool,
+  runPoolifierTest
+} from '../benchmarks-utils.mjs'
 
 const poolSize = availableParallelism()
-const pools = []
-for (const poolType of Object.values(PoolTypes)) {
-  for (const workerType of Object.values(WorkerTypes)) {
-    if (workerType === WorkerTypes.cluster) {
-      continue
-    }
-    for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
-      for (const enableTasksQueue of [false, true]) {
-        if (workerChoiceStrategy === WorkerChoiceStrategies.FAIR_SHARE) {
-          for (const measurement of [Measurements.runTime, Measurements.elu]) {
-            pools.push([
-              `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${enableTasksQueue}|measurement:${measurement}`,
-              buildPool(workerType, poolType, poolSize, {
-                workerChoiceStrategy,
-                workerChoiceStrategyOptions: {
-                  measurement
-                },
-                enableTasksQueue
-              })
-            ])
-          }
-        } else {
-          pools.push([
-            `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${enableTasksQueue}`,
-            buildPool(workerType, poolType, poolSize, {
-              workerChoiceStrategy,
-              enableTasksQueue
-            })
-          ])
-        }
-      }
-    }
-  }
-}
+const fixedThreadPool = buildPoolifierPool(
+  WorkerTypes.thread,
+  PoolTypes.fixed,
+  poolSize
+)
 
 const taskExecutions = 1
 const workerData = {
   function: TaskFunctions.jsonIntegerSerialization,
   taskSize: 1000
 }
-const addPools = pools =>
-  pools.map(([name, pool]) => {
-    return add(name, async () => {
-      await runTest(pool, {
-        taskExecutions,
-        workerData
-      })
-    })
-  })
 
-const resultsFile = 'poolifier'
-const resultsFolder = 'benchmarks/internal/results'
-suite(
-  'Poolifier',
-  ...addPools(pools),
-  cycle(),
-  complete(),
-  save({
-    file: resultsFile,
-    folder: resultsFolder,
-    format: 'json',
-    details: true
-  }),
-  save({
-    file: resultsFile,
-    folder: resultsFolder,
-    format: 'chart.html',
-    details: true
-  }),
-  save({
-    file: resultsFile,
-    folder: resultsFolder,
-    format: 'table.html',
-    details: true
+const poolifierSuite = new Benchmark.Suite('Poolifier')
+
+for (const pool of [fixedThreadPool]) {
+  for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
+    for (const enableTasksQueue of [false, true]) {
+      poolifierSuite.add(
+        `${pool.constructor.name}|${workerChoiceStrategy}|${
+          enableTasksQueue ? 'with' : 'without'
+        } tasks queue`,
+        async () => {
+          pool.setWorkerChoiceStrategy(workerChoiceStrategy)
+          pool.enableTasksQueue(enableTasksQueue)
+          assert.strictEqual(
+            pool.opts.workerChoiceStrategy,
+            workerChoiceStrategy
+          )
+          assert.strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
+          await runPoolifierTest(pool, {
+            taskExecutions,
+            workerData
+          })
+        }
+      )
+    }
+  }
+}
+
+poolifierSuite
+  .on('cycle', event => {
+    console.info(event.target.toString())
   })
-)
-  .then(() => {
-    // eslint-disable-next-line n/no-process-exit
-    return process.exit()
+  .on('complete', function () {
+    console.info(
+      'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
+    )
+    fixedThreadPool.destroy()
   })
-  .catch(err => console.error(err))
+  .run({ async: true })