第二次 ComputePressure 源试用宣布

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

在过去一年中,Intel 一直在与 Google 和其他方就 Compute Pressure API 展开合作。在 Chrome 115 中,您可以注册源试用来帮助测试这个新 API。本文将介绍该 API 旨在解决的问题,并介绍如何使用该 API。

问题

Web 正成为一个关键的应用平台,借助新功能,不仅可以实现视频会议等应用,还能为用户提供愉悦的体验。基于 Web 的体验可即时加载,可从任何位置访问,且无需预先安装。

用户希望应用能够快速加载并及时响应。他们还希望尽可能延长电池续航时间,并希望设备安静无声且触摸时不会发热。在同时打造高级体验时,有时很难实现这些目标,因为流畅的动画和背景视频模糊处理会消耗大量处理能力,使硬件达到极限并耗尽电池电量。

此外,用户使用各种设备访问 Web 应用。一台使用了五年的笔记本电脑与一台全新的台式机相比,其功能会大不相同,即使它们运行的是相同的浏览器版本也是如此。

开发者通常会选择针对最低公分母进行开发,避免使用会给旧款或性能较差的设备带来负担的一些功能。不过,如果能够为拥有强大设备且处于合适环境的用户优化体验,为什么不这样做呢?例如,通过手机加入视频通话时,只看到当前发言者可能是最佳体验。不过,在桌面设备上,能够看到通话中的所有人会很不错,而且硬件通常能够胜任此任务。为此,您需要在不牺牲用户隐私的情况下获取实时硬件遥测数据,以便用于安排任务以及逐步开启和关闭功能,从而确保顺畅的用户体验。这时,Compute Pressure API 可以派上用场。

什么是 Compute Pressure API?

Compute Pressure API 提供表示系统压力的概要状态。这些高级状态可确保在隐私(不分享过多可识别用户的具体信息)和开发者可以轻松推理的信息之间取得良好的平衡。此外,它还允许实现使用正确的底层硬件指标,以确保用户可以充分利用可用的所有处理能力,前提是系统未处于不可管理的压力之下。

例如,现代 CPU 在大多数情况下,无论是单个核心还是所有核心,在 100% 利用率下都能正常运行,因此如果 API 将 80% 的利用率硬编码为关键值,可能会导致开发者未充分利用硬件的功能,并提供不太理想的用户体验。另一方面,系统可能没有得到适当的冷却,或者环境温度可能非常高(例如夏季),因此系统可能在 CPU 利用率达到较高水平之前就开始节流。当前 API 适用于全局 CPU 压力,但我们计划尝试在主线程和 worker 中启用每页 CPU 压力。

计算压力有以下状态:

  • 正常:当前工作负载造成的压力极小,系统可以以较低的时钟频率运行以节省电量。
  • 良好:系统运行良好,一切顺利,并且可以顺利承担额外的工作。
  • 严重:系统存在一些严重压力,但可控,系统运行良好,但可能接近其极限:
    • 时钟速度(取决于交流电源或直流电源)始终很高。
    • 热级别较高,但仍可控,且不会导致节流。

此时,如果您添加更多工作,系统可能会进入关键状态。

  • 严重:系统即将达到上限,但尚未达到上限。“严重”并不意味着系统正在积极节流,但这种状态无法长期维持,如果工作负载保持不变,可能会导致节流。此信号是 Web 应用减轻工作负载的最后一次调用。

启用 Compute Pressure API

默认情况下,Chrome 中未启用 Compute Pressure API,但您可以通过明确启用该功能在 Chrome 115 中对其进行实验。您可以通过启用 enable-experimental-web-platform-features 标志在本地激活它。

为了面向应用的所有访问者启用此功能,我们目前正在进行源代码试用,该试用将在 Chrome 118(2023 年 7 月 18 日)结束。 如需参与试用,请注册,然后在 HTML 或 HTTP 标头中添加包含来源试用令牌的元元素。如需了解详情,请参阅开始使用源代码试用版一文。

观察计算压力

以下代码段展示了如何监控计算压力的变化并据此采取行动:

// The `records` parameter is a sequence of records between two
// consecutive callbacks. Currently it contains ten entries, but
// this is an implementation detail.
function callback(records) {
  const lastRecord = records.pop();
  console.log(`Current pressure ${lastRecord.state}`);
  if (lastRecord.state === 'critical') {
    // Reduce workers load by 4.
  } else if (lastRecord.state === 'serious') {
    // Reduce workers load by 2.
  } else {
    // Do not reduce.
  }
}

const observer = new PressureObserver(callback, {
  // Sample rate in Hertz.
  sampleRate: 1,
});
observer.observe('cpu');

以下代码段展示了如何从 iframe 使用 Compute Pressure API:

<iframe src="https://mysite.com/" allow="compute-pressure">
  <script>
    // Use Compute Pressure API.
  </script>
</iframe>

平台支持

Compute Pressure API 适用于 Linux、ChromeOS、macOS 和 Windows 上的 Chrome 115。

演示

请试用下面嵌入的演示,了解计算压力状态如何根据一些人为压力而变化。

如果您的浏览器不支持该 API,请观看以下视频,其中展示了演示的录制内容。

反馈

在此阶段,开发者反馈非常重要,因此请在 GitHub 上提交问题,提供建议和问题。

致谢

主打图片由 Robert Anasch 在 Unsplash 上创建。本文由 Rachel AndrewThomas Steiner 审核。