1 import { strictEqual } from 'node:assert'
3 import Benchmark from 'benchmark'
4 import { bench, group } from 'mitata'
13 WorkerChoiceStrategies,
15 } from '../lib/index.mjs'
17 const buildPoolifierPool = (workerType, poolType, poolSize, poolOptions) => {
21 case WorkerTypes.thread:
22 return new FixedThreadPool(
24 './benchmarks/internal/thread-worker.mjs',
27 case WorkerTypes.cluster:
28 return new FixedClusterPool(
30 './benchmarks/internal/cluster-worker.cjs',
35 case PoolTypes.dynamic:
37 case WorkerTypes.thread:
38 return new DynamicThreadPool(
39 Math.floor(poolSize / 2),
41 './benchmarks/internal/thread-worker.mjs',
44 case WorkerTypes.cluster:
45 return new DynamicClusterPool(
46 Math.floor(poolSize / 2),
48 './benchmarks/internal/cluster-worker.cjs',
56 const runPoolifierPool = async (pool, { taskExecutions, workerData }) => {
57 return await new Promise((resolve, reject) => {
59 for (let i = 1; i <= taskExecutions; i++) {
64 if (executions === taskExecutions) {
77 export const runPoolifierBenchmarkBenchmarkJs = async (
82 { taskExecutions, workerData }
84 return await new Promise((resolve, reject) => {
85 const pool = buildPoolifierPool(workerType, poolType, poolSize)
87 const suite = new Benchmark.Suite(name)
88 for (const workerChoiceStrategy of Object.values(
89 WorkerChoiceStrategies
91 for (const enableTasksQueue of [false, true]) {
92 if (workerChoiceStrategy === WorkerChoiceStrategies.FAIR_SHARE) {
93 for (const measurement of [
98 `${name} with ${workerChoiceStrategy}, with ${measurement} and ${
99 enableTasksQueue ? 'with' : 'without'
102 pool.setWorkerChoiceStrategy(workerChoiceStrategy, {
105 pool.enableTasksQueue(enableTasksQueue)
107 pool.opts.workerChoiceStrategy,
110 strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
112 pool.opts.workerChoiceStrategyOptions.measurement,
115 await runPoolifierPool(pool, {
124 `${name} with ${workerChoiceStrategy} and ${
125 enableTasksQueue ? 'with' : 'without'
128 pool.setWorkerChoiceStrategy(workerChoiceStrategy)
129 pool.enableTasksQueue(enableTasksQueue)
131 pool.opts.workerChoiceStrategy,
134 strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
135 await runPoolifierPool(pool, {
145 .on('cycle', event => {
146 console.info(event.target.toString())
148 .on('complete', function () {
151 LIST_FORMATTER.format(this.filter('fastest').map('name'))
153 const destroyTimeout = setTimeout(() => {
154 console.error('Pool destroy timeout reached (30s)')
162 clearTimeout(destroyTimeout)
166 .run({ async: true })
178 export const buildPoolifierBenchmarkMitata = (
183 { taskExecutions, workerData }
186 const pool = buildPoolifierPool(workerType, poolType, poolSize)
187 for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
188 for (const enableTasksQueue of [false, true]) {
189 if (workerChoiceStrategy === WorkerChoiceStrategies.FAIR_SHARE) {
190 for (const measurement of [Measurements.runTime, Measurements.elu]) {
193 `${name} with ${workerChoiceStrategy}, with ${measurement} and ${
194 enableTasksQueue ? 'with' : 'without'
197 pool.setWorkerChoiceStrategy(workerChoiceStrategy, {
200 pool.enableTasksQueue(enableTasksQueue)
202 pool.opts.workerChoiceStrategy,
205 strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
207 pool.opts.workerChoiceStrategyOptions.measurement,
210 await runPoolifierPool(pool, {
221 `${name} with ${workerChoiceStrategy} and ${
222 enableTasksQueue ? 'with' : 'without'
225 pool.setWorkerChoiceStrategy(workerChoiceStrategy)
226 pool.enableTasksQueue(enableTasksQueue)
228 pool.opts.workerChoiceStrategy,
231 strictEqual(pool.opts.enableTasksQueue, enableTasksQueue)
232 await runPoolifierPool(pool, {
248 const LIST_FORMATTER = new Intl.ListFormat('en-US', {