v152 · performance · device
CPU Performance API
A new navigator.cpu namespace that exposes a bucketed, privacy-safe signal about the device's CPU performance tier — letting web applications adapt their rendering quality, workload parallelism, and feature set to the actual hardware without fingerprinting individual machines.
at a glance
| Shipped in | Chrome 152 (Enabled by default) |
|---|---|
| Status | Enabled by default |
| Flag | None — on by default |
| Spec | wicg.github.io/cpu-performance (WICG) |
| Standards position (Firefox) | No signal |
| Standards position (Safari) | Oppose |
| ChromeStatus | 5189864286978048 — CPU Performance API |
why it exists
Web applications — especially WebGL/WebGPU games, video editors, and complex data-visualization dashboards — often need to tailor their workload to the device. Today, developers are forced to approximate CPU power by measuring the time taken to run synthetic microbenchmarks, which is slow, unreliable, and a fingerprinting vector in itself.
The CPU Performance API surfaces a coarsened bucket rather than precise clock speed or core counts, deliberately preventing individual device identification while still allowing the application to pick an appropriate quality preset. The API is specifically scoped to use cases like "should I enable 4× supersampling or 1×?" or "how many Web Workers should I spin up for this task?"
Source: chromestatus feature summary; WICG specshape of the API
| Property | Type | Description |
|---|---|---|
navigator.cpu.normalizedPerformance | number (0.0–1.0) | Bucketed performance score where 1.0 is the highest tier; values are coarsened to a small set of buckets to reduce fingerprint surface |
The exact bucket boundaries and score mapping are defined in the WICG spec and may be refined before the final standard is published.
Source: wicg.github.io/cpu-performanceexample
// Adjust rendering quality based on CPU tier
const perf = navigator.cpu?.normalizedPerformance ?? 0.5;
if (perf >= 0.75) {
// High-end: enable shadows, anti-aliasing, 60fps target
initRenderer({ shadows: true, msaa: 4, targetFPS: 60 });
} else if (perf >= 0.4) {
// Mid-range: reduced quality
initRenderer({ shadows: false, msaa: 2, targetFPS: 30 });
} else {
// Low-end: minimal quality
initRenderer({ shadows: false, msaa: 0, targetFPS: 24 });
}
// Choose parallelism for CPU-bound work
const workerCount = Math.max(1, Math.round(navigator.cpu.normalizedPerformance * 4));
const pool = createWorkerPool(workerCount);
Source: WICG CPU Performance spec
browser support
| Browser | Support | Notes |
|---|---|---|
| Chrome 152+ | Enabled by default | All platforms |
| Firefox | No signal | — |
| Safari | Oppose | Privacy concerns about CPU bucketing as a fingerprinting signal |