perf(benchmark): port to homemade mitata fork
[poolifier.git] / benchmarks / internal / bench.mjs
index 1fba608aa22d4f684f78cd7ab75baf4ba9e4cfac..480998b72c935900681627839091162befbd6a23 100644 (file)
-import { add, complete, cycle, save, suite } from 'benny'
-import {
-  WorkerChoiceStrategies,
-  availableParallelism
-} from '../../lib/index.mjs'
+import { exit } from 'node:process'
+import { parseArgs } from 'node:util'
+
 import {
+  availableParallelism,
   PoolTypes,
-  WorkerFunctions,
   WorkerTypes
-} from '../benchmarks-types.mjs'
-import { buildPool, runTest } from '../benchmarks-utils.mjs'
+} from '../../lib/index.mjs'
+import { TaskFunctions } from '../benchmarks-types.cjs'
+import {
+  runPoolifierBenchmarkBenchmarkJsSuite,
+  runPoolifierBenchmarkMitata
+} from '../benchmarks-utils.mjs'
 
 const poolSize = availableParallelism()
-const pools = []
-for (const poolType of Object.values(PoolTypes)) {
-  for (const workerType of Object.values(WorkerTypes)) {
-    for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
-      for (const tasksQueue of [false, true]) {
-        const pool = buildPool(
-          workerType,
-          poolType,
-          poolSize,
-          tasksQueue
-            ? {
-                ...{
-                  workerChoiceStrategy
-                },
-                ...{ enableTasksQueue: true }
-              }
-            : {
-                workerChoiceStrategy
-              }
-        )
-        pools.push([
-          `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${tasksQueue}`,
-          pool
-        ])
-      }
-    }
-  }
-}
-
 const taskExecutions = 1
 const workerData = {
-  function: WorkerFunctions.jsonIntegerSerialization,
-  taskSize: 1000
+  function: TaskFunctions.factorial,
+  taskSize: 50000
 }
-const addPools = pools =>
-  pools.map(([name, pool]) => {
-    return add(name, async () => {
-      await runTest(pool, {
+
+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
+}
 
-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
-  })
-)
-  .then(() => {
-    // eslint-disable-next-line n/no-process-exit
-    return process.exit()
-  })
-  .catch(err => console.error(err))
+exit()