X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=benchmarks%2Fbenchmarks-utils.mjs;h=35c335c45877748ec332e45cd10fda5e5d4b69df;hb=a191d3fbb41de19e0175fe793fa3590c7d8705ab;hp=03596b276c3cae5abd1b9fc074e11f7442ddf6ca;hpb=a6bef8d25e5de99cd86083a21b04030d335b9ee2;p=poolifier.git diff --git a/benchmarks/benchmarks-utils.mjs b/benchmarks/benchmarks-utils.mjs index 03596b27..35c335c4 100644 --- a/benchmarks/benchmarks-utils.mjs +++ b/benchmarks/benchmarks-utils.mjs @@ -1,7 +1,7 @@ import { strictEqual } from 'node:assert' import Benchmark from 'benchmark' -import { bench, group } from 'mitata' +import { bench, clear, group, run } from 'tatami-ng' import { DynamicClusterPool, @@ -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({ async: true }) + }) +} + +export const runPoolifierBenchmarkBenchmarkJsSuite = async ( name, workerType, poolType, @@ -84,22 +155,46 @@ export const runPoolifierBenchmarkBenchmarkJs = async ( ) => { return await new Promise((resolve, reject) => { const pool = buildPoolifierPool(workerType, poolType, poolSize) - try { - const suite = new Benchmark.Suite(name) - 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 - ]) { - suite.add( - `${name} with ${workerChoiceStrategy}, with ${measurement} and ${ - enableTasksQueue ? 'with' : 'without' - } tasks queue`, - async () => { + const suite = new Benchmark.Suite(name, { + onComplete: () => { + if (pool.started && !pool.destroying) { + pool.destroy().then(resolve).catch(reject) + } else { + resolve() + } + }, + onCycle: event => { + console.info(event.target.toString()) + }, + onError: event => { + if (pool.started && !pool.destroying) { + pool + .destroy() + .then(() => { + return reject(event.target.error) + }) + .catch(() => {}) + } else { + reject(event.target.error) + } + } + }) + 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]) { + suite.add( + `${name} with ${workerChoiceStrategy}, with ${measurement} and ${ + enableTasksQueue ? 'with' : 'without' + } tasks queue`, + async () => { + await runPoolifierPool(pool, { + taskExecutions, + workerData + }) + }, + { + onStart: () => { pool.setWorkerChoiceStrategy(workerChoiceStrategy, { measurement }) @@ -113,19 +208,23 @@ export const runPoolifierBenchmarkBenchmarkJs = async ( pool.opts.workerChoiceStrategyOptions.measurement, measurement ) - await runPoolifierPool(pool, { - taskExecutions, - workerData - }) } - ) - } - } else { - suite.add( - `${name} with ${workerChoiceStrategy} and ${ - enableTasksQueue ? 'with' : 'without' - } tasks queue`, - async () => { + } + ) + } + } else { + suite.add( + `${name} with ${workerChoiceStrategy} and ${ + enableTasksQueue ? 'with' : 'without' + } tasks queue`, + async () => { + await runPoolifierPool(pool, { + taskExecutions, + workerData + }) + }, + { + onStart: () => { pool.setWorkerChoiceStrategy(workerChoiceStrategy) pool.enableTasksQueue(enableTasksQueue) strictEqual( @@ -133,50 +232,24 @@ export const runPoolifierBenchmarkBenchmarkJs = async ( workerChoiceStrategy ) strictEqual(pool.opts.enableTasksQueue, enableTasksQueue) - await runPoolifierPool(pool, { - taskExecutions, - workerData - }) } - ) - } + } + ) } } - suite - .on('cycle', event => { - console.info(event.target.toString()) - }) - .on('complete', function () { - console.info( - 'Fastest is ' + - LIST_FORMATTER.format(this.filter('fastest').map('name')) - ) - const destroyTimeout = setTimeout(() => { - console.error('Pool destroy timeout reached (30s)') - resolve() - }, 30000) - pool - .destroy() - .then(resolve) - .catch(reject) - .finally(() => { - clearTimeout(destroyTimeout) - }) - .catch(() => {}) - }) - .run({ async: true }) - } catch (error) { - pool - .destroy() - .then(() => { - return reject(error) - }) - .catch(() => {}) } + suite + .on('complete', function () { + console.info( + 'Fastest is ' + + LIST_FORMATTER.format(this.filter('fastest').map('name')) + ) + }) + .run({ async: true }) }) } -export const buildPoolifierBenchmarkMitata = ( +export const runPoolifierBenchmarkTatamiNg = async ( name, workerType, poolType, @@ -195,23 +268,27 @@ export const buildPoolifierBenchmarkMitata = ( enableTasksQueue ? 'with' : 'without' } tasks queue`, async () => { - pool.setWorkerChoiceStrategy(workerChoiceStrategy, { - measurement - }) - pool.enableTasksQueue(enableTasksQueue) - strictEqual( - pool.opts.workerChoiceStrategy, - workerChoiceStrategy - ) - strictEqual(pool.opts.enableTasksQueue, enableTasksQueue) - strictEqual( - pool.opts.workerChoiceStrategyOptions.measurement, - measurement - ) await runPoolifierPool(pool, { taskExecutions, workerData }) + }, + { + before: () => { + pool.setWorkerChoiceStrategy(workerChoiceStrategy, { + measurement + }) + pool.enableTasksQueue(enableTasksQueue) + strictEqual( + pool.opts.workerChoiceStrategy, + workerChoiceStrategy + ) + strictEqual(pool.opts.enableTasksQueue, enableTasksQueue) + strictEqual( + pool.opts.workerChoiceStrategyOptions.measurement, + measurement + ) + } } ) }) @@ -223,24 +300,30 @@ export const buildPoolifierBenchmarkMitata = ( enableTasksQueue ? 'with' : 'without' } tasks queue`, async () => { - pool.setWorkerChoiceStrategy(workerChoiceStrategy) - pool.enableTasksQueue(enableTasksQueue) - strictEqual( - pool.opts.workerChoiceStrategy, - workerChoiceStrategy - ) - strictEqual(pool.opts.enableTasksQueue, enableTasksQueue) await runPoolifierPool(pool, { taskExecutions, workerData }) + }, + { + before: () => { + pool.setWorkerChoiceStrategy(workerChoiceStrategy) + pool.enableTasksQueue(enableTasksQueue) + strictEqual( + pool.opts.workerChoiceStrategy, + workerChoiceStrategy + ) + strictEqual(pool.opts.enableTasksQueue, enableTasksQueue) + } } ) }) } } } - return pool + await run() + clear() + await pool.destroy() } catch (error) { console.error(error) }