Compute Pressure API
注意:此功能在 Web Workers 中可用,但 Service Workers 除外。
Compute Pressure API 是一项 JavaScript API,可让您观察系统资源(如 CPU)的压力。
用例
在实时应用程序(例如视频会议 Web 应用)中,Compute Pressure API 可以让您检测系统当前面临的压力。系统会尽其所能处理任何压力,但系统与应用程序之间的协作有助于最好地处理压力。此 API 会通知您高级别的压力状态变化,以便您可以调整工作负载,同时仍提供令人愉悦的用户体验。当系统压力趋势上升或缓解时,会主动传递信号,以便及时适应。
例如,您可以使用这些压力变化信号来降低或提高视频质量,或减少同时显示的视频流数量,以避免视频帧丢失、音频中断或应用程序其他关键部分延迟。您的 Web 应用的服务质量可能会发生变化,这也会由于外部因素和应用程序在意外时间带来的压力,但理想情况下,这不会导致系统完全崩溃、输入延迟或无响应。相反,启用的功能集及其质量水平会与最终用户设备的资源压力进行平衡。这类似于网络压力,在这种情况下,流媒体应用会适应可用的带宽。
更多用例包括:
- Web 游戏,您可以平衡 3D 资源的质量和数量、更改帧率、分辨率、景深等,以确保低延迟和稳定的帧率。
- 用户界面,在系统压力较大时,您可以渲染占位符而不是真实数据,并在压力缓解后渲染真实内容。
概念与用法
快速且令人愉悦的 Web 应用程序应在系统计算资源(接近)满负荷使用时平衡工作负载。Compute Pressure API 的目标是防止,而不是缓解 Web 应用本身以及用户设备出现糟糕的用户体验,使其不会过热、过吵或以不可接受的速度耗尽电池。因此,建议优先使用此 API,而不是反馈机制或单一的性能调整(例如,通过降低 window.requestAnimationFrame 的频率),这些机制可能会缓解糟糕的用户体验,但无法主动避免。对于事后衡量和细分用户会话的性能,PerformanceLongTaskTiming API 更适合分析占用 UI 线程 50 毫秒或更长时间的任务(另请参阅 Performance API 以获取其他性能测量 API)。
压力源类型
在您的 Web 应用或网站中,不同的任务都在争夺不同处理单元(CPU、GPU 和其他专用处理单元)的处理时间。Compute Pressure API 规范的当前版本定义了两种主要源类型,可以进行查询以收集压力信息:
"thermals"代表整个系统的全局热量状态。"cpu"代表所有核心的中央处理单元 (CPU) 的平均压力。这种状态可能会受到除观察站点之外的其他应用和站点的影响。
支持的源列表因浏览器、操作系统和硬件而异,并且仍在不断发展。使用静态的 PressureObserver.knownSources 提示来查看您的浏览器可用的源类型。请注意,可用性也可能因您的操作系统和硬件而异。调用 observe() 并检查 NotSupportedError 以查看压力观测是否可行。
Compute Pressure API 在以下上下文中可用:
Window(主线程)WorkerSharedWorker<iframe>(如果提供了合适的 Permissions-Policy)
压力状态
Compute Pressure API 暴露了高级别的压力状态,这些状态抽象了系统瓶颈的复杂性,而这些复杂性无法通过处理器时钟速度和利用率等低级指标充分解释。事实上,CPU 利用率指标通常具有误导性。因此,Compute Pressure API 使用以下含义的人类可读压力状态(另请参阅规范):
- ⚪
"nominal":目标设备的状况处于可接受水平,对用户没有明显的不利影响。 - 🟢
"fair":目标设备的压力、温度和/或能源消耗略有升高,可能导致电池续航时间缩短,以及风扇(或带风扇的系统)启动并发出声音。除此之外,目标设备运行正常,可以承担额外的工作。 - 🟡
"serious":目标设备的压力、温度和/或能源消耗持续高度升高。系统可能正在节流以作为减少热量的对策。 - 🔴
"critical":目标设备或系统的温度显著升高,需要冷却以避免任何潜在问题。
上述压力状态的促成因素(即底层系统指标)不由规范定义,并且可能因底层硬件和平台行为而异。但是,规范要求促成因素的变化必须是实质性的,以避免状态之间的频繁切换。这意味着您可以预期 API 不会过于频繁地报告不同的状态,因为它们不是响应单一的波动系统指标。
安全和隐私注意事项
Compute Pressure API 由 "compute-pressure" 指令策略控制。其默认允许列表是 'self',允许在同源嵌套框架中使用,但阻止第三方内容使用该功能。
参考
接口
Compute Pressure API 包含以下接口,并且 API 表面类似于其他观察器,例如 IntersectionObserver、MutationObserver 或 PerformanceObserver。
PressureObserverExperimental-
当系统压力在预定义的采样间隔内针对指定数量的源(例如,CPU)发生变化时发出通知。
PressureRecord-
描述过渡时刻的压力趋势。
Permissions-Policy 指令
Permissions-Policy;compute-pressure指令-
控制对 Compute Pressure API 的访问。
示例
记录当前压力
此示例创建了一个 PressureObserver,并在每次压力变化时采取行动。采样间隔设置为 1000 毫秒,这意味着最多每秒会有一次更新。
function callback(records) {
const lastRecord = records[records.length - 1];
console.log(`Current pressure ${lastRecord.state}`);
if (lastRecord.state === "critical") {
// disable video feeds
} else if (lastRecord.state === "serious") {
// disable video filter effects
} else {
// enable all video feeds and filter effects
}
}
try {
const observer = new PressureObserver(callback);
await observer.observe("cpu", {
sampleInterval: 1000, // 1000ms
});
} catch (error) {
// report error setting up the observer
}
规范
| 规范 |
|---|
| 计算压力级别 1 # the-pressureobserver-object |
浏览器兼容性
加载中…
另见
- Compute Pressure 演示,它使用 Mandelbrot 集和工作线程来创建人工压力以供测试。