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 中能够执行 指令线程的部分,包括物理逻辑部分, 具体以操作系统报告的信息为准。

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

3. 性能等级

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

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

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

3.1. 计算性能等级值

计算 性能层级用户设备的 CPU
  1. cores 为操作系统报告的 CPU核心数量,如果操作系统未报告 核心数量,则为 null。

  2. 如果 cores 为 null 或 0,则返回 0。

  3. 如果 cores 为 1,则返回 1。

  4. 如果 cores 介于 2 和 4 之间(含两端),则返回 2。

  5. 如果 cores 介于 5 和 10 之间(含两端),则返回 3。

  6. 返回 4。

注: 当已知某个 CPU 型号的性能显著 好于或差于其核心数量通常对应的水平时,允许实现调整 返回的性能 层级。此类调整通常 最多将性能 层级移动一个层级(即 +1 或 −1),并且需要从操作系统获得有关 CPU 型号的 可靠信息。应用此类 调整的 CPU 型号集合由实现定义。

注: 此算法的 JavaScript 参考 实现——包括一组具有代表性的、 源自 Chromium 浏览器引擎实现的基于型号的调整——可在 cpu-performance 仓库中获取, 其中还提供了一个交互式演示 页面,用于说明 该算法及其基于型号的启发式规则如何对各种 真实设备进行分类。这些内容不具有规范性;它们表示对 本节算法应用基于型号调整后的一种建议 实现。

此 API 的实现还应遵循以下规则:

  1. 一致性:任何对性能层级进行的基于型号的调整 都应反映可通过 特定基准测试测得的 CPU 性能, 最好使用浏览器提供的编程工具 (JavaScript、WebAssembly 等)并在理想条件下进行测量。性能更 强的设备不应被归类到比性能较弱设备更低的性能层级 中。

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

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

    • 实现不应重新定义层级;也就 是说,不应为了适应随着技术进步而出现的更新、更高性能设备,将层级 4 的设备重新归类为 层级 3。 相反,在需要时,本规范将为这些较新的设备增加新的层级 5, 此后再增加层级 6,依此类推。

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

  3. 用户隐私:为避免用户指纹识别,实现应 确保有相当大量的用户设备归入每个 性能 层级(另请参阅 § 5 安全和隐私考虑)。特别是, 基于型号的调整应足够粗粒度,使每个性能层级仍包含 许多不同的 CPU 型号,而特殊值 0 仅应在实现无法从操作系统获得 核心数量信息时返回。

4. JavaScript API

[
    SecureContext,
    Exposed=Window
] partial interface Navigator {
    readonly attribute unsigned short cpuPerformance;
};
cpuPerformance 获取器 的步骤如下:
  1. tier 为对设备的 CPU 计算 性能层级的结果,并且可能包含 § 3.1 计算性能层级值中所述的基于型号的调整。

  2. 断言:0 ≤ tier ≤ 4。

  3. 返回 tier

5. 安全与隐私考量

CPU Performance API 将仅在 HTTPS 安全上下文中可用。

为降低指纹识别风险,CPU Performance API 不会直接透露 CPU 特征。报告的值是一个较小的整数,用于 表示与 CPU 对应的性能 层级。对于每个 可能的值(层级), 实现应确保在任意给定 时间,互联网上存在的相当大量的计算设备,无论是按绝对数量还是按不同的 CPU 型号计算,都被归类 为具有此性能 层级。特别是,本 规范的意图是,每个性能层级都应包含不少于 10% 的现有 CPU 型号,并且在任意给定时间包含不少于 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" 与规范性文本分隔开, 如下所示:

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

索引

由本 规范定义的术语

由引用 定义的术语

参考文献

规范性引用

[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;
};