perf(benchmark): port to homemade mitata fork
[poolifier.git] / benchmarks / internal / bench.mjs
index 258854f864702ecf92816e151b33d14f38c96840..480998b72c935900681627839091162befbd6a23 100644 (file)
-import Benchmark from 'benchmark'
+import { exit } from 'node:process'
+import { parseArgs } from 'node:util'
+
 import {
-  Measurements,
+  availableParallelism,
   PoolTypes,
-  WorkerChoiceStrategies,
-  WorkerTypes,
-  availableParallelism
+  WorkerTypes
 } from '../../lib/index.mjs'
-import { TaskFunctions } from '../benchmarks-types.mjs'
+import { TaskFunctions } from '../benchmarks-types.cjs'
 import {
-  LIST_FORMATTER,
-  buildPoolifierPool,
-  runPoolifierTest
+  runPoolifierBenchmarkBenchmarkJsSuite,
+  runPoolifierBenchmarkMitata
 } from '../benchmarks-utils.mjs'
 
-const poolifierSuite = new Benchmark.Suite('Poolifier', {
-  onCycle: event => {
-    console.info(event.target.toString())
-  },
-  onComplete: function () {
-    console.info(
-      'Fastest is ' + LIST_FORMATTER.format(this.filter('fastest').map('name'))
-    )
-  }
-})
-
 const poolSize = availableParallelism()
-const benchmarkSettings = []
-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]) {
-            benchmarkSettings.push([
-              `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${enableTasksQueue}|measurement:${measurement}`,
-              workerType,
-              poolType,
-              poolSize,
-              {
-                workerChoiceStrategy,
-                workerChoiceStrategyOptions: {
-                  measurement
-                },
-                enableTasksQueue
-              }
-            ])
-          }
-        } else {
-          benchmarkSettings.push([
-            `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${enableTasksQueue}`,
-            workerType,
-            poolType,
-            poolSize,
-            {
-              workerChoiceStrategy,
-              enableTasksQueue
-            }
-          ])
-        }
-      }
-    }
-  }
-}
-
 const taskExecutions = 1
 const workerData = {
-  function: TaskFunctions.jsonIntegerSerialization,
-  taskSize: 100
+  function: TaskFunctions.factorial,
+  taskSize: 50000
 }
 
-for (const [
-  name,
-  workerType,
-  poolType,
-  poolSize,
-  poolOptions
-] of benchmarkSettings) {
-  poolifierSuite.add(name, async () => {
-    const pool = buildPoolifierPool(workerType, poolType, poolSize, poolOptions)
-    await runPoolifierTest(pool, {
-      taskExecutions,
-      workerData
-    })
-    await pool.destroy()
-  })
+switch (
+  parseArgs({
+    args: process.argv,
+    options: {
+      type: {
+        type: 'string',
+        short: 't'
+      }
+    },
+    strict: true,
+    allowPositionals: true
+  }).values.type
+) {
+  case 'mitata':
+    await runPoolifierBenchmarkMitata(
+      'FixedThreadPool',
+      WorkerTypes.thread,
+      PoolTypes.fixed,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkMitata(
+      'DynamicThreadPool',
+      WorkerTypes.thread,
+      PoolTypes.dynamic,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkMitata(
+      'FixedClusterPool',
+      WorkerTypes.cluster,
+      PoolTypes.fixed,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkMitata(
+      'DynamicClusterPool',
+      WorkerTypes.cluster,
+      PoolTypes.dynamic,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    break
+  case 'benchmark.js':
+  default:
+    await runPoolifierBenchmarkBenchmarkJsSuite(
+      'FixedThreadPool',
+      WorkerTypes.thread,
+      PoolTypes.fixed,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkBenchmarkJsSuite(
+      'DynamicThreadPool',
+      WorkerTypes.thread,
+      PoolTypes.dynamic,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkBenchmarkJsSuite(
+      'FixedClusterPool',
+      WorkerTypes.cluster,
+      PoolTypes.fixed,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    await runPoolifierBenchmarkBenchmarkJsSuite(
+      'DynamicClusterPool',
+      WorkerTypes.cluster,
+      PoolTypes.dynamic,
+      poolSize,
+      {
+        taskExecutions,
+        workerData
+      }
+    )
+    break
 }
 
-poolifierSuite.run({ async: true })
+exit()