X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Futils.ts;h=e08b31aa838537c1ceee37f284ff39ac53960308;hb=ae04560e0cdbf750bac433a691bfee1b0f5f54e1;hp=e534ead2363947b40096c2734517a1d7c1ea3550;hpb=9a38f99e676160c0bc7d28fe88f27b01fa31b5a1;p=poolifier.git diff --git a/src/pools/utils.ts b/src/pools/utils.ts index e534ead2..e08b31aa 100644 --- a/src/pools/utils.ts +++ b/src/pools/utils.ts @@ -1,11 +1,12 @@ 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 ( @@ -91,6 +92,7 @@ export const checkValidTasksQueueOptions = ( ) } } + export const checkWorkerNodeArguments = ( worker: Worker, tasksQueueBackPressureSize: number @@ -114,3 +116,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 + } + } + } +}