计算压力 API
注意: 此功能在 Web Workers 中可用,但 Service Workers 除外。
计算压力 API 是一个 JavaScript API,它使您能够观察系统资源(例如 CPU)的压力。
用例
在实时应用程序(例如视频会议 Web 应用程序)中,计算压力 API 使您能够检测系统当前面临的压力。系统会尽其所能处理任何压力,但系统和应用程序之间的协作对于最佳地处理压力非常有用。此 API 通知您高级压力状态的变化,以便您可以调整工作负载并仍然提供愉悦的用户体验。当系统压力趋势上升或缓解时,会主动提供信号,以便及时适应。
例如,您可以使用这些压力变化信号来降低或提高视频质量或同时显示的视频提要数量,以避免视频帧丢失、音频中断或延迟应用程序的其他关键部分。您的 Web 应用程序的服务质量也可能因意外时间外部因素和应用程序的压力而异,但理想情况下,这不会导致系统完全故障、输入延迟或无响应。相反,启用功能的集合及其质量级别会根据最终用户设备的资源压力进行平衡。这类似于网络压力,在这种情况下,流媒体应用程序会适应可用带宽。
更多用例包括:
- Web 游戏,您可以平衡 3D 资产的质量和数量,更改帧率、分辨率、景深等,以确保低延迟和稳定的帧率。
- 用户界面,当系统处于压力之下时,您可以渲染占位符而不是真实数据,并在压力缓解后渲染真实内容。
概念和用法
快速且令人愉悦的 Web 应用程序应在系统计算资源已使用(接近)满负荷时平衡工作负载。计算压力 API 的目标是防止(而不是缓解)Web 应用程序本身出现不良的用户体验,并防止用户的设备过热、过响或以不可接受的速度耗尽电池。因此,建议优先使用此 API,而不是反馈机制或单一性能调整(例如,通过降低 window.requestAnimationFrame
的频率),在这些情况下,可能会缓解不良的用户体验,但不会主动避免。对于事后测量和细分用户会话的性能,PerformanceLongTaskTiming
API 更适合分析占用 UI 线程 50 毫秒或更长时间的任务(另请参阅 Performance API 以获取其他性能测量 API)。
压力源类型
在您的 Web 应用程序或网站中,不同的任务争夺不同处理单元(CPU、GPU 和其他专用处理单元)的处理时间。当前版本的计算压力 API 规范定义了两种主要源类型,可以查询这些类型以收集压力信息
"thermals"
表示整个系统的全局热状态。"cpu"
表示所有内核的中央处理单元 (CPU) 的平均压力。此状态可能会受到观察站点以外的其他应用程序和站点的影響。
支持的源列表因浏览器、操作系统和硬件而异,并且还在不断发展。使用静态 PressureObserver.knownSources
提示查看哪些源类型可用于您的浏览器。请注意,可用性也可能因您的操作系统和硬件而异。调用 observe()
并检查 NotSupportedError
以查看压力观察是否可行。
计算压力 API 在以下上下文中可用:
Window
(主线程)工作线程
共享工作线程
<iframe>
(如果提供了合适的 Permissions-Policy)
压力状态
计算压力 API 公开了高级压力状态,这些状态抽象了系统瓶颈的复杂性,而这些复杂性无法用诸如处理器时钟速度和利用率之类的低级指标充分解释。实际上,CPU 利用率的指标通常 具有误导性。因此,计算压力 API 使用以下语义的人类可读压力状态(另请参阅 规范)
- ⚪
"nominal"
:目标设备的条件处于可接受的水平,对用户没有明显的负面影响。 - 🟢
"fair"
:目标设备的压力、温度和/或能耗略有升高,可能会导致电池寿命缩短,以及风扇(或带风扇的系统)变得活跃并发出声音。除此之外,目标设备运行完美,可以承担更多工作。 - 🟡
"serious"
:目标设备的压力、温度和/或能耗持续高度升高。系统可能会进行节流作为降低热量的对策。 - 🔴
"critical"
:目标设备或系统的温度显着升高,需要冷却以避免任何潜在问题。
上述压力状态的促成因素(即底层系统指标)未由规范定义,并且可能因底层硬件和平台行为而异。但是,规范要求促成因素的变化必须很大,以避免在状态之间反复切换。这意味着您可以预期 API 不会过于频繁地报告不同的状态,因为它们不会响应单个波动的系统指标。
安全和隐私注意事项
计算压力 API 受 策略控制,受 "compute-pressure"
指令控制。其默认允许列表为 'self'
,允许在同源嵌套框架中使用,但阻止第三方内容使用此功能。
参考
接口
以下接口存在于计算压力 API 中,并且 API 表面类似于其他观察器,例如 IntersectionObserver
、MutationObserver
或 PerformanceObserver
。
PressureObserver
实验性-
当系统压力针对指定数量的源(例如 CPU)在预定义的采样间隔内发生变化时发出通知。
PressureRecord
-
描述特定转换时刻的压力趋势。
Permission-Policy 指令
Permissions-Policy
;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 |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。
另请参阅
- 计算压力演示,它使用 Mandelbrot 集和工作线程来创建用于测试目的的人工压力。