From e0ab0e1d05daf5f2e815866272ce41716f6f6703 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 16 Mar 2024 23:44:02 +0100 Subject: [PATCH] fix: readd cpu speed computation but only if necessary MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- benchmarks/benchmarks-utils.cjs | 2 +- src/pools/utils.ts | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/benchmarks/benchmarks-utils.cjs b/benchmarks/benchmarks-utils.cjs index 4dd1227b..b4a0d9bd 100644 --- a/benchmarks/benchmarks-utils.cjs +++ b/benchmarks/benchmarks-utils.cjs @@ -89,8 +89,8 @@ const runPoolifierPoolBenchmark = async ( ) => { return await new Promise((resolve, reject) => { const pool = buildPoolifierPool(workerType, poolType, poolSize) - const suite = new Benchmark.Suite(name) try { + const suite = new Benchmark.Suite(name) for (const workerChoiceStrategy of Object.values( WorkerChoiceStrategies )) { diff --git a/src/pools/utils.ts b/src/pools/utils.ts index 533ca9cc..724c4ab9 100644 --- a/src/pools/utils.ts +++ b/src/pools/utils.ts @@ -100,21 +100,39 @@ const getDefaultWeights = ( return weights } +const estimatedCpuSpeed = (): number => { + const runs = 150000000 + const begin = performance.now() + // eslint-disable-next-line no-empty + for (let i = runs; i > 0; i--) {} + const end = performance.now() + const duration = end - begin + return Math.trunc(runs / duration / 1000) // in MHz +} + const getDefaultWorkerWeight = (): number => { + const currentCpus = cpus() + let estCpuSpeed: number | undefined + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (currentCpus.every(cpu => cpu.speed == null || cpu.speed === 0)) { + estCpuSpeed = estimatedCpuSpeed() + } let cpusCycleTimeWeight = 0 - for (const cpu of cpus()) { + for (const cpu of currentCpus) { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (cpu.speed == null || cpu.speed === 0) { cpu.speed = - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-non-null-assertion, - cpus().find(cpu => cpu.speed != null && cpu.speed !== 0)!.speed + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + currentCpus.find(cpu => cpu.speed != null && cpu.speed !== 0)?.speed ?? + estCpuSpeed ?? + 2000 } // CPU estimated cycle time const numberOfDigits = cpu.speed.toString().length - 1 const cpuCycleTime = 1 / (cpu.speed / Math.pow(10, numberOfDigits)) cpusCycleTimeWeight += cpuCycleTime * Math.pow(10, numberOfDigits) } - return Math.round(cpusCycleTimeWeight / cpus().length) + return Math.round(cpusCycleTimeWeight / currentCpus.length) } export const checkFilePath = (filePath: string | undefined): void => { -- 2.34.1