v146 · capabilities · performance

Compute Pressure Pairing

Use the CPU Performance API for a static device tier, then combine it with live Compute Pressure states. The tier sets the quality ceiling; pressure and hysteresis decide how quickly the app steps down under load.

Feature detection checking...
CPU Performance API
-
Reading navigator.cpuPerformance...
Current spec surface: navigator.cpuPerformance, a coarse numeric tier where 1-4 increases capability and 0 means unknown.
Heuristic fallback
-
hardwareConcurrency + deviceMemory
Shown beside the real API so authors can see what the platform tier replaces when the API is available.
Applied app tier
-
Detecting...
This low / mid / high app tier selects the row family in the quality matrix. Override it below to test every floor.
Tier and pressure controls
Applied tier override
Raw pressure sample
Waiting for samples...
Current recommendation Detecting signals...
Media output preview
Video preset pending

Pressure history: raw samples and effective recommendation

Decision matrix - tier x pressure -> quality

Highlighted row matches the applied tier and the effective pressure state after hysteresis and pause rules.

CPU tierPressure stateVideo qualityML featuresParticle budgetBackground tasks
Highnominal1080p 60fpsOn, full model2000All enabled
Highfair1080p 30fpsOn, full model1000Throttled
Highserious720p 30fpsOn, lite model400Paused
Highcritical480p 15fpsOff0Paused
Midnominal720p 30fpsOn, lite model500Enabled
Midfair720p 15fpsOn, lite model200Throttled
Midserious480p 15fpsOff50Paused
Midcritical360p 10fpsOff0Paused
Lownominal480p 15fpsOff50Throttled
Lowfair360p 10fpsOff0Paused
Lowserious240p 10fpsOff0Paused
LowcriticalAudio onlyOff0Paused
const rawTier = typeof navigator.cpuPerformance === "number"
  ? navigator.cpuPerformance
  : 0;

const appTier = mapCpuPerformanceToAppTier(rawTier);

const observer = new PressureObserver((records) => {
  const rawPressure = records.at(-1).state;
  const effectivePressure = hysteresis.push(rawPressure);
  applyQualityPreset(appTier, effectivePressure);
});

try {
  await observer.observe("cpu", { sampleInterval: 1000 });
} catch (error) {
  // NotAllowedError can mean Permissions-Policy blocked "compute-pressure".
  useSimulationControls(error.name);
}

see also