CPU 性能 API

非正式提案草案,

关于此文档的更多详细信息
此版本:
https://wicg.github.io/cpu-performance/
问题跟踪:
GitHub
编辑:
(Google)

摘要

本文档定义了一个简单的 Web API,用于公开一些 关于用户设备性能强弱的信息。它面向将使用此类静态信息来提供 改进用户体验的 Web 应用,可能会与 Compute Pressure API 结合使用,后者提供有关用户 设备 CPU 压力/利用率的动态信息,并允许应用 对 CPU 压力的变化作出反应。

本文档状态

1. 引言

本节为非规范性内容。

开发者一直有兴趣根据用户设备的性能强弱来调整 Web 内容。 例如,视频会议应用或视频游戏可能会使用这些信息来决定是否可以渲染 高级视频效果;各种类型的应用也可能会使用这些信息来决定是否 尝试在本地运行 AI 任务,或委托给服务器等。

具体而言,Web 应用可能希望使用性能信息来:

  1. 控制非必要任务和请求;例如, 允许或阻止第三方脚本, 使用或避免使用大型库。

  2. 调整 Web 内容的复杂度;例如, 图像和视频的分辨率与格式, 上传数据的压缩级别, 启用或禁用动画等计算量较大的操作, 改进资源管理(延迟加载、预取、预渲染)。

  3. 改进真实用户监测;例如, 更好地了解用户拥有更快还是更慢的设备, 更恰当地集中开发工作。

  4. 在客户端侧运行计算,而不是在服务器侧运行;例如, 使用服务器端渲染, 在客户端侧运行 AI 应用和 LLM。

  5. 选择更适合用户设备的广告。

2. CPU 性能

现代计算设备通常集成多个异构 处理单元,它们在性质和能力上各不相同。 中央处理单元(CPU)是每个计算设备中的核心组件。 现代计算设备包含若干集成电路(多核 处理器),每个集成电路包含若干个作为独立 CPU 运行的 物理 核心。 此外,同步多线程(或超线程)技术 允许 物理核心 处理 多个指令线程,因此在 操作系统看来表现为多个独立的 逻辑核心

除 CPU 之外,现代计算机还可能包含其他类型的处理单元, 例如:

本规范目前仅涉及中央处理单元, 旨在向 Web 应用公开其性能的一个度量。 本规范的未来版本也可能涉及其他类型的 处理单元。

我们将使用术语 CPU 来指代 计算设备中包含的一组中央处理 单元。 我们将使用术语 核心 来 指代可执行指令线程的 CPU 部分,即操作系统报告的 物理逻辑 核心。我们将使用术语 频率 来指代 CPU 的时钟速度,以每秒周期数(Hz) 表示,并决定 物理核心 执行指令的速度。

我们将使用术语 性能 来指代从 Web 应用的角度看, CPU 被感知到的速度。快速的 CPU 可以更快地处理任务,例如带来更快的应用加载、更好的 多任务处理、更流畅的游戏体验等。

3. 性能等级

CPU Performance API 根据用户设备的 CPU 性能,将其归类到少数几个 性能 等级。每个 性能等级 由一个较小的正 整数表示。值越高,对应的 性能等级 越高,即 用户设备越强大。

共有四个不同的 性能等级,编号为 1–4。使用 该 API 的应用应处理额外的 等级(编号为 5 及 以上),随着设备随时间改进,这些等级很可能会在未来添加。

特殊值 0(零)对应未知的 性能等级, 当该 API 的实现无法对用户设备进行分类时返回。

3.1. 计算性能等级值

将用户设备分类到 性能等级由实现定义的,并且应由 Web 应用 根据其特定需求进行解释。不过,该 API 的实现应 遵循以下规则:

  1. 一致性:设备到 性能等级 的映射应 反映可通过特定基准测试测量到的 CPU 性能,理想情况下使用浏览器提供的编程工具 (JavaScript、WebAssembly 等)并在理想条件下测量。性能更强的 设备不应被归类到比性能较弱设备更低的 性能等级 中。

  2. 可复现性:实现应始终为同一用户设备报告相同的 性能等级。 具体而言:

    • 报告的 性能等级 不应取决于用户 设备的 当前负载或利用率;并且

    • 实现不应重新定义 等级;也 就是说,随着技术进步,不应为了容纳更新、更高性能的设备 而将 等级 4 设备重新分类为 等级 3。 相反,当有需要时,本规范会为这些更新的设备添加新的 等级 5, 然后再添加 等级 6,依此类推。

    注: 此规则的目的并不是让 修复该 API 实现中的分类错误变得不可能。这类错误 不可避免地需要被修复。相反,该规则的目的 是不要因为新技术出现而重新分类 CPU 型号,以免 破坏运行过时应用的过时机器的行为。

  3. 用户隐私:为避免用户指纹识别,实现应 在每个 性能等级 中分类数量相当多的用户设备(另见 § 5 安全与隐私考量)。 具体而言,基于某些 CPU 型号数据库的实现,不应 对数据库中未包含的新用户设备返回特殊值 0。该特殊 值仅应在实现无法从操作系统获取有关 CPU 的信息时返回。

实现可以(但不要求)根据以下特征计算给定用户设备的 性能等级 值:

4. JavaScript API

[
    SecureContext,
    Exposed=Window
] partial interface Navigator {
    readonly attribute unsigned short cpuPerformance;
};
cpuPerformance getter 步骤为:
  1. tier 为一个 unsigned short, 表示设备 CPU性能等级,它以 由实现定义的方式生成,同时考虑 § 3.1 计算 性能等级值 中描述的建议 和约束。

  2. 断言:0 ≤ tier ≤ 4。

  3. 返回 tier

5. 安全与隐私考量

CPU Performance API 仅可用于 HTTPS 安全上下文。

为降低指纹识别风险,CPU Performance API 不会直接公开 CPU 特征。报告的值是一个较小的整数, 表示与 CPU 对应的 性能 等级。对于每个 可能的值(等级), 实现应确保互联网上在任意给定 时间存在的相当多计算设备,无论按绝对数量还是按不同的 CPU 型号计算,都被分类 为具有该 性能 等级。具体而言,本 规范的意图是,每个 性能等级 应包含不少于现有 CPU 型号的 10%,且不少于任意给定时间现有用户 设备的 10%。

另见 TAG 安全/隐私调查问卷

6. 示例

本节为非规范性内容。

视频会议应用可以按如下方式解释这四个 性能等级。 这种解释是应用特定的,即便如此,如果应用本身未来更新并且其 硬件需求发生变化,它也可能 需要随之更新。

这样的应用可以使用 navigator.cpuPerformance 的值 来预先选择若干最适合用户设备 性能 等级 支持的功能。

function getPresetFeatures() {
  switch (navigator.cpuPerformance) {
    case 1:
      return {
        videoQuality: "QVGA",
        frameRate: 15,
        effects: [],
      };
    case 2:
      return {
        videoQuality: "VGA",
        frameRate: 15,
        effects: ['voice-detection', 'animated-reactions'],
      };
    case 3:
      return {
        videoQuality: "720p",
        frameRate: 30,
        effects: ['voice-detection', 'animated-reactions',
                  'noise-reduction'],
      };
    case 4:
    case 0:    // 对未知设备假设使用高性能设置
    default:   // 以及对高于 4 的性能等级同样如此。
      return {
        videoQuality: "1080p",
        frameRate: 30,
        effects: ['voice-detection', 'animated-reactions',
                  'noise-reduction', 'virtual-background'],
      };
  }
}

7. 致谢

非常感谢以下人士提供的宝贵反馈和建议: Dominic Farolino、 Deepti Gandluri、 Reilly Grant、 Tomas Gunnarsson、 Markus Handell、 Michael Lippautz、 Thomas Nattestad、 Nicola Tommasi、 Guido Urdaneta、 Måns Vestin 和 Chen Xing。

感谢 W3C Web Performance Working Group(WebPerf),尤其是 Yoav Weiss。

一致性

文档 约定

一致性要求通过 描述性断言 与 RFC 2119 术语的组合来表达。 本文档规范性部分中的关键词 “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、 “MAY” 和 “OPTIONAL” 应按 RFC 2119 中的描述进行解释。 但是,为了可读性, 这些词在本规范中并不全部以大写字母出现。

本规范的所有文本都是规范性的, 但明确标记为非规范性的章节、示例和注释除外。 [RFC2119]

本规范中的示例以 “for example” 等词引入, 或通过 class="example" 与规范性文本分隔开, 如下所示:

这是一个资料性示例。

资料性注释以 “Note” 一词开头, 并通过 class="note" 与规范性文本分隔开, 如下所示:

注意,这是一个资料性注释。

测试

与本规范内容相关的测试 可以记录在像这样的 “Tests” 块中。 任何此类块都是非规范性的。


索引

由本 规范定义的术语

由引用 定义的术语

参考文献

规范性引用

[HTML]
Anne van Kesteren; et al. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 现行标准. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳当前实践. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 现行 标准. URL: https://webidl.spec.whatwg.org/

IDL 索引

[
    SecureContext,
    Exposed=Window
] partial interface Navigator {
    readonly attribute unsigned short cpuPerformance;
};