X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Futils.ts;h=eb800c4ab50f9d39e2b6fc98ebb4cf39bfc134b5;hb=daa30e0e21087d1a3cf24b3dd38f703b1aba6d46;hp=e534ead2363947b40096c2734517a1d7c1ea3550;hpb=9a38f99e676160c0bc7d28fe88f27b01fa31b5a1;p=poolifier.git diff --git a/src/pools/utils.ts b/src/pools/utils.ts index e534ead2..eb800c4a 100644 --- a/src/pools/utils.ts +++ b/src/pools/utils.ts @@ -1,20 +1,14 @@ import { existsSync } from 'node:fs' -import { isPlainObject } from '../utils' +import { average, isPlainObject, max, median, min } from '../utils' import { + type MeasurementStatisticsRequirements, WorkerChoiceStrategies, type WorkerChoiceStrategy } from './selection-strategies/selection-strategies-types' import type { TasksQueueOptions } from './pool' -import type { IWorker } from './worker' +import type { IWorker, MeasurementStatistics } from './worker' export const checkFilePath = (filePath: string): void => { - if ( - filePath == null || - typeof filePath !== 'string' || - (typeof filePath === 'string' && filePath.trim().length === 0) - ) { - throw new Error('Please specify a file with a worker implementation') - } if (!existsSync(filePath)) { throw new Error(`Cannot find the worker file '${filePath}'`) } @@ -91,6 +85,7 @@ export const checkValidTasksQueueOptions = ( ) } } + export const checkWorkerNodeArguments = ( worker: Worker, tasksQueueBackPressureSize: number @@ -114,3 +109,47 @@ export const checkWorkerNodeArguments = ( ) } } + +/** + * Updates the given measurement statistics. + * + * @param measurementStatistics - The measurement statistics to update. + * @param measurementRequirements - The measurement statistics requirements. + * @param measurementValue - The measurement value. + * @param numberOfMeasurements - The number of measurements. + * @internal + */ +export const updateMeasurementStatistics = ( + measurementStatistics: MeasurementStatistics, + measurementRequirements: MeasurementStatisticsRequirements, + measurementValue: number +): void => { + if (measurementRequirements.aggregate) { + measurementStatistics.aggregate = + (measurementStatistics.aggregate ?? 0) + measurementValue + measurementStatistics.minimum = min( + measurementValue, + measurementStatistics.minimum ?? Infinity + ) + measurementStatistics.maximum = max( + measurementValue, + measurementStatistics.maximum ?? -Infinity + ) + if ( + (measurementRequirements.average || measurementRequirements.median) && + measurementValue != null + ) { + measurementStatistics.history.push(measurementValue) + if (measurementRequirements.average) { + measurementStatistics.average = average(measurementStatistics.history) + } else if (measurementStatistics.average != null) { + delete measurementStatistics.average + } + if (measurementRequirements.median) { + measurementStatistics.median = median(measurementStatistics.history) + } else if (measurementStatistics.median != null) { + delete measurementStatistics.median + } + } + } +}