fix: readd cpu speed computation but only if necessary
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 16 Mar 2024 22:44:02 +0000 (23:44 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 16 Mar 2024 22:44:02 +0000 (23:44 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
benchmarks/benchmarks-utils.cjs
src/pools/utils.ts

index 4dd1227b00b2362b393b47113e70a154aad6fe87..b4a0d9bd8dd518420330ea5700fe1972b6995027 100644 (file)
@@ -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
       )) {
index 533ca9cc7c27e6a9dc066315aa2e9560536a5775..724c4ab960c691e8f4a5d8661f9c442ff14d5b3d 100644 (file)
@@ -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 => {