feat(benchmark): add helper to run unique benchmark with benchmarks.js
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 31 Mar 2024 22:46:03 +0000 (00:46 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 31 Mar 2024 22:46:03 +0000 (00:46 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
benchmarks/benchmarks-utils.mjs
benchmarks/internal/bench.mjs

index a74a36ee6dbb05ad645aea2f468c2b61835efdfb..e81c3773faef7fd179abdd2b27ad9af18c92f156 100644 (file)
@@ -76,6 +76,77 @@ const runPoolifierPool = async (pool, { taskExecutions, workerData }) => {
 }
 
 export const runPoolifierBenchmarkBenchmarkJs = async (
+  name,
+  workerType,
+  poolType,
+  poolSize,
+  poolOptions,
+  { taskExecutions, workerData }
+) => {
+  return await new Promise((resolve, reject) => {
+    const pool = buildPoolifierPool(workerType, poolType, poolSize, poolOptions)
+    let workerChoiceStrategy
+    let enableTasksQueue
+    let workerChoiceStrategyOptions
+    if (poolOptions != null) {
+      ({
+        workerChoiceStrategy,
+        enableTasksQueue,
+        workerChoiceStrategyOptions
+      } = poolOptions)
+    }
+    const measurement = workerChoiceStrategyOptions?.measurement
+    new Benchmark(
+      `${name} with ${workerChoiceStrategy ?? pool.opts.workerChoiceStrategy}${
+        measurement != null ? `, with ${measurement}` : ''
+      } and ${enableTasksQueue ? 'with' : 'without'} tasks queue`,
+      async () => {
+        await runPoolifierPool(pool, {
+          taskExecutions,
+          workerData
+        })
+      },
+      {
+        onStart: () => {
+          if (workerChoiceStrategy != null) {
+            strictEqual(pool.opts.workerChoiceStrategy, workerChoiceStrategy)
+          }
+          if (enableTasksQueue != null) {
+            strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
+          }
+          if (measurement != null) {
+            strictEqual(
+              pool.opts.workerChoiceStrategyOptions.measurement,
+              measurement
+            )
+          }
+        },
+        onComplete: event => {
+          console.info(event.target.toString())
+          if (pool.started && !pool.destroying) {
+            pool.destroy().then(resolve).catch(reject)
+          } else {
+            resolve()
+          }
+        },
+        onError: event => {
+          if (pool.started && !pool.destroying) {
+            pool
+              .destroy()
+              .then(() => {
+                return reject(event.target.error)
+              })
+              .catch(() => {})
+          } else {
+            reject(event.target.error)
+          }
+        }
+      }
+    ).run()
+  })
+}
+
+export const runPoolifierBenchmarkBenchmarkJsSuite = async (
   name,
   workerType,
   poolType,
@@ -113,7 +184,7 @@ export const runPoolifierBenchmarkBenchmarkJs = async (
         if (workerChoiceStrategy === WorkerChoiceStrategies.FAIR_SHARE) {
           for (const measurement of [Measurements.runTime, Measurements.elu]) {
             suite.add(
-              `${name} with ${workerChoiceStrategy}, with measurement ${measurement} and ${
+              `${name} with ${workerChoiceStrategy}, with ${measurement} and ${
                 enableTasksQueue ? 'with' : 'without'
               } tasks queue`,
               async () => {
index aa98be858bb66f6f819f4c52c190cab45c48d6fc..564a4de14621bf6bd096e7fc940753f8eb6ee0d9 100644 (file)
@@ -11,7 +11,7 @@ import {
 import { TaskFunctions } from '../benchmarks-types.cjs'
 import {
   buildPoolifierBenchmarkMitata,
-  runPoolifierBenchmarkBenchmarkJs
+  runPoolifierBenchmarkBenchmarkJsSuite
 } from '../benchmarks-utils.mjs'
 
 const poolSize = availableParallelism()
@@ -87,7 +87,7 @@ switch (
     break
   case 'benchmark.js':
   default:
-    await runPoolifierBenchmarkBenchmarkJs(
+    await runPoolifierBenchmarkBenchmarkJsSuite(
       'FixedThreadPool',
       WorkerTypes.thread,
       PoolTypes.fixed,
@@ -97,7 +97,7 @@ switch (
         workerData
       }
     )
-    await runPoolifierBenchmarkBenchmarkJs(
+    await runPoolifierBenchmarkBenchmarkJsSuite(
       'DynamicThreadPool',
       WorkerTypes.thread,
       PoolTypes.dynamic,
@@ -107,7 +107,7 @@ switch (
         workerData
       }
     )
-    await runPoolifierBenchmarkBenchmarkJs(
+    await runPoolifierBenchmarkBenchmarkJsSuite(
       'FixedClusterPool',
       WorkerTypes.cluster,
       PoolTypes.fixed,
@@ -117,7 +117,7 @@ switch (
         workerData
       }
     )
-    await runPoolifierBenchmarkBenchmarkJs(
+    await runPoolifierBenchmarkBenchmarkJsSuite(
       'DynamicClusterPool',
       WorkerTypes.cluster,
       PoolTypes.dynamic,