From 034962b82c0eb94cc3f1df604e95343ad4facc87 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 3 Jul 2025 11:23:55 +0200 Subject: [PATCH] refactor: cleanup statistics related namespace MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/performance/PerformanceStatistics.ts | 13 ++++--- src/types/Statistics.ts | 2 +- src/types/orm/entities/PerformanceRecord.ts | 2 +- src/utils/StatisticUtils.ts | 6 +-- src/utils/index.ts | 2 +- tests/utils/StatisticUtils.test.ts | 43 +++++++++------------ 6 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/performance/PerformanceStatistics.ts b/src/performance/PerformanceStatistics.ts index b4d8d31b..6d862f69 100644 --- a/src/performance/PerformanceStatistics.ts +++ b/src/performance/PerformanceStatistics.ts @@ -21,6 +21,7 @@ import { type TimestampedData, } from '../types/index.js' import { + average, buildPerformanceStatisticsMessage, Configuration, Constants, @@ -31,11 +32,10 @@ import { logger, logPrefix, max, - mean, median, min, - nthPercentile, - stdDeviation, + percentile, + std, } from '../utils/index.js' export class PerformanceStatistics { @@ -252,15 +252,16 @@ export class PerformanceStatistics { .measurementTimeSeries as CircularBuffer ) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement = mean(timeMeasurementValues) + this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement = + average(timeMeasurementValues) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.statistics.statisticsData.get(entry.name)!.medTimeMeasurement = median(timeMeasurementValues) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.statistics.statisticsData.get(entry.name)!.ninetyFiveThPercentileTimeMeasurement = - nthPercentile(timeMeasurementValues, 95) + percentile(timeMeasurementValues, 95) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.statistics.statisticsData.get(entry.name)!.stdDevTimeMeasurement = stdDeviation( + this.statistics.statisticsData.get(entry.name)!.stdTimeMeasurement = std( timeMeasurementValues, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.statistics.statisticsData.get(entry.name)!.avgTimeMeasurement diff --git a/src/types/Statistics.ts b/src/types/Statistics.ts index 83da1905..02927e07 100644 --- a/src/types/Statistics.ts +++ b/src/types/Statistics.ts @@ -23,7 +23,7 @@ export type StatisticsData = Partial<{ ninetyFiveThPercentileTimeMeasurement: number requestCount: number responseCount: number - stdDevTimeMeasurement: number + stdTimeMeasurement: number timeMeasurementCount: number totalTimeMeasurement: number }> diff --git a/src/types/orm/entities/PerformanceRecord.ts b/src/types/orm/entities/PerformanceRecord.ts index f0206ab0..8f9b9204 100644 --- a/src/types/orm/entities/PerformanceRecord.ts +++ b/src/types/orm/entities/PerformanceRecord.ts @@ -15,7 +15,7 @@ interface StatisticsData { ninetyFiveThPercentileTimeMeasurement: number requestCount: number responseCount: number - stdDevTimeMeasurement: number + stdTimeMeasurement: number timeMeasurementCount: number totalTimeMeasurement: number } diff --git a/src/utils/StatisticUtils.ts b/src/utils/StatisticUtils.ts index fc453236..2c65759a 100644 --- a/src/utils/StatisticUtils.ts +++ b/src/utils/StatisticUtils.ts @@ -1,4 +1,4 @@ -export const mean = (dataSet: number[]): number => { +export const average = (dataSet: number[]): number => { if (Array.isArray(dataSet) && dataSet.length === 0) { return 0 } @@ -28,7 +28,7 @@ export const max = (...args: number[]): number => args.reduce((maximum, num) => (maximum > num ? maximum : num), Number.NEGATIVE_INFINITY) // TODO: use order statistics tree https://en.wikipedia.org/wiki/Order_statistic_tree -export const nthPercentile = (dataSet: number[], percentile: number): number => { +export const percentile = (dataSet: number[], percentile: number): number => { if (percentile < 0 && percentile > 100) { throw new RangeError('Percentile is not between 0 and 100') } @@ -62,7 +62,7 @@ export const nthPercentile = (dataSet: number[], percentile: number): number => * @see https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation * @internal */ -export const stdDeviation = (dataSet: number[], dataSetAverage: number = mean(dataSet)): number => { +export const std = (dataSet: number[], dataSetAverage: number = average(dataSet)): number => { if (Array.isArray(dataSet) && (dataSet.length === 0 || dataSet.length === 1)) { return 0 } diff --git a/src/utils/index.ts b/src/utils/index.ts index cc970bed..c9baaf34 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -25,7 +25,7 @@ export { buildStoppedMessage, buildUpdatedMessage, } from './MessageChannelUtils.js' -export { max, mean, median, min, nthPercentile, stdDeviation } from './StatisticUtils.js' +export { average, max, median, min, percentile, std } from './StatisticUtils.js' export { clone, convertToBoolean, diff --git a/tests/utils/StatisticUtils.test.ts b/tests/utils/StatisticUtils.test.ts index 1ba3366f..95419fb1 100644 --- a/tests/utils/StatisticUtils.test.ts +++ b/tests/utils/StatisticUtils.test.ts @@ -1,21 +1,14 @@ import { expect } from '@std/expect' import { describe, it } from 'node:test' -import { - max, - mean, - median, - min, - nthPercentile, - stdDeviation, -} from '../../src/utils/StatisticUtils.js' +import { average, max, median, min, percentile, std } from '../../src/utils/StatisticUtils.js' await describe('StatisticUtils test suite', async () => { - await it('Verify mean()', () => { - expect(mean([])).toBe(0) - expect(mean([0.08])).toBe(0.08) - expect(mean([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146) - expect(mean([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335) + await it('Verify average()', () => { + expect(average([])).toBe(0) + expect(average([0.08])).toBe(0.08) + expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146) + expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335) }) await it('Verify median()', () => { @@ -41,20 +34,20 @@ await describe('StatisticUtils test suite', async () => { expect(max(-1, 0)).toBe(0) }) - await it('Verify nthPercentile()', () => { - expect(nthPercentile([], 25)).toBe(0) - expect(nthPercentile([0.08], 50)).toBe(0.08) + await it('Verify percentile()', () => { + expect(percentile([], 25)).toBe(0) + expect(percentile([0.08], 50)).toBe(0.08) const array0 = [0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03] - expect(nthPercentile(array0, 0)).toBe(0.25) - expect(nthPercentile(array0, 50)).toBe(3.05) - expect(nthPercentile(array0, 80)).toBe(4.974) - expect(nthPercentile(array0, 85)).toBe(5.131) - expect(nthPercentile(array0, 90)).toBe(5.434) - expect(nthPercentile(array0, 95)).toBe(5.736999999999999) - expect(nthPercentile(array0, 100)).toBe(6.04) + expect(percentile(array0, 0)).toBe(0.25) + expect(percentile(array0, 50)).toBe(3.05) + expect(percentile(array0, 80)).toBe(4.974) + expect(percentile(array0, 85)).toBe(5.131) + expect(percentile(array0, 90)).toBe(5.434) + expect(percentile(array0, 95)).toBe(5.736999999999999) + expect(percentile(array0, 100)).toBe(6.04) }) - await it('Verify stdDeviation()', () => { - expect(stdDeviation([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(2.1879050645374383) + await it('Verify std()', () => { + expect(std([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(2.1879050645374383) }) }) -- 2.43.0