1. 引言
本节为非规范性内容。
开发者一直有兴趣根据用户设备的性能强弱来调整 Web 内容。 例如,视频会议应用或视频游戏可能会使用这些信息来决定是否可以渲染 高级视频效果;各种类型的应用也可能会使用这些信息来决定是否 尝试在本地运行 AI 任务,或委托给服务器等。
具体而言,Web 应用可能希望使用性能信息来:
-
控制非必要任务和请求;例如, 允许或阻止第三方脚本, 使用或避免使用大型库。
-
调整 Web 内容的复杂度;例如, 图像和视频的分辨率与格式, 上传数据的压缩级别, 启用或禁用动画等计算量较大的操作, 改进资源管理(延迟加载、预取、预渲染)。
-
改进真实用户监测;例如, 更好地了解用户拥有更快还是更慢的设备, 更恰当地集中开发工作。
-
在客户端侧运行计算,而不是在服务器侧运行;例如, 使用服务器端渲染, 在客户端侧运行 AI 应用和 LLM。
-
选择更适合用户设备的广告。
2. CPU 性能
现代计算设备通常集成多个异构 处理单元,它们在性质和能力上各不相同。 中央处理单元(CPU)是每个计算设备中的核心组件。 现代计算设备包含若干集成电路(多核 处理器),每个集成电路包含若干个作为独立 CPU 运行的 物理 核心。 此外,同步多线程(或超线程)技术 允许 物理核心 处理 多个指令线程,因此在 操作系统看来表现为多个独立的 逻辑核心。
除 CPU 之外,现代计算机还可能包含其他类型的处理单元, 例如:
-
图形处理单元(GPU),用于并行处理复杂图形、视频 以及计算密集型任务,例如科学仿真 和 AI 训练;
-
神经处理单元(NPU)或张量处理单元(TPU),用于提升 AI 和机器学习任务的性能;
-
数字信号处理器(DSP),用于优化信号的实时处理;
-
现场可编程门阵列(FPGA),用于通过 可重配置、可编程硬件实现的自定义加速器 优化特定任务,等等。
本规范目前仅涉及中央处理器, 旨在向 Web 应用暴露其性能的度量。 本规范的未来版本还可能涉及其他类型的 处理单元。
我们将使用术语 CPU 表示 计算设备中包含的中央处理 单元的集合。 我们将使用术语 核心 来 指代 CPU 中能够执行 指令线程的部分,包括物理 或逻辑部分, 具体以操作系统报告的信息为准。
我们将使用术语 性能 来表示从 Web 应用的角度来看,CPU 被 感知为有多快。快速的 CPU 能更快地处理任务,例如带来更快的应用加载、更好的 多任务处理、更流畅的游戏体验等。
3. 性能等级
CPU Performance API 根据用户设备的 CPU 性能,将其归类到少数几个 性能 等级。每个 性能等级 由一个较小的正 整数表示。值越高,对应的 性能等级 越高,即 用户设备越强大。
共有四个不同的 性能等级,编号为 1–4。使用 该 API 的应用应处理额外的 等级(编号为 5 及 以上),随着设备随时间改进,这些等级很可能会在未来添加。
特殊值 0(零)对应未知的 性能等级, 当该 API 的实现无法对用户设备进行分类时返回。
3.1. 计算性能等级值
注: 当已知某个 CPU 型号的性能显著 好于或差于其核心数量通常对应的水平时,允许实现调整 返回的性能 层级。此类调整通常 最多将性能 层级移动一个层级(即 +1 或 −1),并且需要从操作系统获得有关 CPU 型号的 可靠信息。应用此类 调整的 CPU 型号集合由实现定义。
注: 此算法的 JavaScript 参考 实现——包括一组具有代表性的、 源自 Chromium 浏览器引擎实现的基于型号的调整——可在 cpu-performance 仓库中获取, 其中还提供了一个交互式演示 页面,用于说明 该算法及其基于型号的启发式规则如何对各种 真实设备进行分类。这些内容不具有规范性;它们表示对 本节算法应用基于型号调整后的一种建议 实现。
此 API 的实现还应遵循以下规则:
-
一致性:任何对性能层级进行的基于型号的调整 都应反映可通过 特定基准测试测得的 CPU 性能, 最好使用浏览器提供的编程工具 (JavaScript、WebAssembly 等)并在理想条件下进行测量。性能更 强的设备不应被归类到比性能较弱设备更低的性能层级 中。
-
可复现性:对于同一用户设备,实现应始终报告相同的 性能层级。 具体而言:
-
报告的性能层级不应取决于用户 设备的 当前负载或利用率;并且
-
实现不应重新定义层级;也就 是说,不应为了适应随着技术进步而出现的更新、更高性能设备,将层级 4 的设备重新归类为 层级 3。 相反,在需要时,本规范将为这些较新的设备增加新的层级 5, 此后再增加层级 6,依此类推。
注: 此规则的目的并不是让 修复此 API 实现中的 分类错误变得不可能。此类错误 不可避免地需要修复。相反,此规则的目的是 不因新技术的出现而重新分类 CPU 型号,以免 破坏运行过时应用的过时机器的行为。
-
-
用户隐私:为避免用户指纹识别,实现应 确保有相当大量的用户设备归入每个 性能 层级(另请参阅 § 5 安全和隐私考虑)。特别是, 基于型号的调整应足够粗粒度,使每个性能层级仍包含 许多不同的 CPU 型号,而特殊值 0 仅应在实现无法从操作系统获得 核心数量信息时返回。
4. JavaScript API
[
SecureContext ,
Exposed =Window
] partial interface Navigator {
readonly attribute unsigned short cpuPerformance ;
};
cpuPerformance 获取器
的步骤如下:
-
令 tier 为对设备的 CPU 计算 性能层级的结果,并且可能包含 § 3.1 计算性能层级值中所述的基于型号的调整。
-
断言:0 ≤ tier ≤ 4。
-
返回 tier。
5. 安全与隐私考量
CPU Performance API 将仅在 HTTPS 安全上下文中可用。
为降低指纹识别风险,CPU Performance API 不会直接透露 CPU 特征。报告的值是一个较小的整数,用于 表示与 CPU 对应的性能 层级。对于每个 可能的值(层级), 实现应确保在任意给定 时间,互联网上存在的相当大量的计算设备,无论是按绝对数量还是按不同的 CPU 型号计算,都被归类 为具有此性能 层级。特别是,本 规范的意图是,每个性能层级都应包含不少于 10% 的现有 CPU 型号,并且在任意给定时间包含不少于 10% 的现有用户 设备。
另请参阅 TAG 安全/隐私问卷。
6. 示例
本节为非规范性内容。
视频会议应用可以按如下方式解释四个性能层级。 这种解释特定于具体应用,即便如此,如果应用本身在未来进行了更新且其 硬件要求发生变化,也可能 必须更新这种解释。
-
1:实际上无法用于视频通话的设备;
-
2:性能不足但仍能胜任视频通话的设备;
-
3:能够轻松应对视频通话的设备;以及
-
4:甚至能够运行要求最高的场景,并且仍有 余裕性能用于多任务处理的设备。
此类应用可以使用 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。