perf: optimize min/max implementation
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 3 Sep 2023 14:02:10 +0000 (16:02 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 3 Sep 2023 14:02:10 +0000 (16:02 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStation.ts
src/charging-station/ocpp/OCPPServiceUtils.ts
src/performance/PerformanceStatistics.ts
src/utils/Utils.ts
src/utils/index.ts
test/utils/Utils.test.ts

index a8da873b82b974b0be2ab44bfc0bd2a6775d8633..f84153922b1298cf39cd4555797f3a62cd066975 100644 (file)
@@ -144,6 +144,7 @@ import {
   isUndefined,
   logPrefix,
   logger,
+  min,
   once,
   roundTo,
   secureRandom,
@@ -380,7 +381,7 @@ export class ChargingStation {
     const connectorMaximumPower = this.getMaximumPower() / this.powerDivider;
     const connectorChargingProfilesPowerLimit =
       getChargingStationConnectorChargingProfilesPowerLimit(this, connectorId);
-    return Math.min(
+    return min(
       isNaN(connectorMaximumPower) ? Infinity : connectorMaximumPower,
       isNaN(connectorAmperageLimitationPowerLimit!)
         ? Infinity
index b4a7e3241a94aaa58204b15d782a19ea910950db..7c459809f45f2df877fcb69a2db54953c5e4a8a6 100644 (file)
@@ -40,6 +40,7 @@ import {
   isNotEmptyString,
   logPrefix,
   logger,
+  min,
 } from '../../utils';
 
 export class OCPPServiceUtils {
@@ -421,7 +422,7 @@ export class OCPPServiceUtils {
     const parsedInt = parseInt(value);
     const numberValue = isNaN(parsedInt) ? Infinity : parsedInt;
     return options?.limitationEnabled
-      ? Math.min(numberValue * options.unitMultiplier!, limit)
+      ? min(numberValue * options.unitMultiplier!, limit)
       : numberValue * options.unitMultiplier!;
   }
 
index 64216db2a4f456a74d65e93edada25da3ab198c7..7ff27723afffc3698383a378a5a66143a816b768 100644 (file)
@@ -28,7 +28,9 @@ import {
   generateUUID,
   logPrefix,
   logger,
+  max,
   median,
+  min,
   nthPercentile,
   stdDeviation,
 } from '../utils';
@@ -220,11 +222,11 @@ export class PerformanceStatistics {
     this.statistics.statisticsData.get(entryName)!.timeMeasurementCount =
       (this.statistics.statisticsData.get(entryName)?.timeMeasurementCount ?? 0) + 1;
     this.statistics.statisticsData.get(entryName)!.currentTimeMeasurement = entry.duration;
-    this.statistics.statisticsData.get(entryName)!.minTimeMeasurement = Math.min(
+    this.statistics.statisticsData.get(entryName)!.minTimeMeasurement = min(
       entry.duration,
       this.statistics.statisticsData.get(entryName)?.minTimeMeasurement ?? Infinity,
     );
-    this.statistics.statisticsData.get(entryName)!.maxTimeMeasurement = Math.max(
+    this.statistics.statisticsData.get(entryName)!.maxTimeMeasurement = max(
       entry.duration,
       this.statistics.statisticsData.get(entryName)?.maxTimeMeasurement ?? -Infinity,
     );
index 58e9094c7a601bcd587cf59e6fd79b32a8823b95..a2cb233ad26bc10e3d674f8ca459f3093fba4642 100644 (file)
@@ -397,3 +397,9 @@ export const once = <T, A extends any[], R>(
     return result;
   };
 };
+
+export const min = (...args: number[]): number =>
+  args.reduce((minimum, num) => (minimum < num ? minimum : num), Infinity);
+
+export const max = (...args: number[]): number =>
+  args.reduce((maximum, num) => (maximum > num ? maximum : num), -Infinity);
index f8fbe0e1f59c2b02f3a55ce09acec771bb00d012..f3feeb66d2bfd842d8fad04f9379fce44904f85f 100644 (file)
@@ -49,6 +49,8 @@ export {
   isUndefined,
   isValidTime,
   logPrefix,
+  max,
+  min,
   once,
   promiseWithTimeout,
   roundTo,
index 4a98277511875280e84d24bd7dc135477617d061..ab07ec81d7668321010b4f5e6905f6709d8f22c7 100644 (file)
@@ -26,6 +26,8 @@ import {
   isObject,
   isUndefined,
   isValidTime,
+  max,
+  min,
   once,
   roundTo,
   secureRandom,
@@ -189,11 +191,11 @@ describe('Utils test suite', () => {
     randomInteger = getRandomInteger(2, 1);
     expect(randomInteger).toBeGreaterThanOrEqual(1);
     expect(randomInteger).toBeLessThanOrEqual(2);
-    const max = 2.2,
-      min = 1.1;
-    randomInteger = getRandomInteger(max, min);
-    expect(randomInteger).toBeGreaterThanOrEqual(Math.ceil(min));
-    expect(randomInteger).toBeLessThanOrEqual(Math.floor(max));
+    const maximum = 2.2,
+      minimum = 1.1;
+    randomInteger = getRandomInteger(maximum, minimum);
+    expect(randomInteger).toBeLessThanOrEqual(Math.floor(maximum));
+    expect(randomInteger).toBeGreaterThanOrEqual(Math.ceil(minimum));
   });
 
   it('Verify roundTo()', () => {
@@ -447,4 +449,18 @@ describe('Utils test suite', () => {
     expect(called).toBe(1);
     expect(result3).toBe(1);
   });
+
+  it('Verify min()', () => {
+    expect(min(0, 1)).toBe(0);
+    expect(min(1, 0)).toBe(0);
+    expect(min(0, -1)).toBe(-1);
+    expect(min(-1, 0)).toBe(-1);
+  });
+
+  it('Verify max()', () => {
+    expect(max(0, 1)).toBe(1);
+    expect(max(1, 0)).toBe(1);
+    expect(max(0, -1)).toBe(0);
+    expect(max(-1, 0)).toBe(0);
+  });
 });