需要反馈:实验性响应性指标

有关衡量网络响应能力的计划的最新动态。

Hongbo Song
Hongbo Song

<ph type="x-smartling-placeholder">

今年早些时候,Chrome 速度指标团队分享了一些 新的响应性指标我们希望设计一个指标, 各个事件的端到端延迟时间,让您更全面地了解 网页在整个生命周期内的整体响应情况

最近几个月,我们在这一指标方面取得了很大进展, 我想与您分享我们计划如何衡量互动延迟时间的最新消息 介绍几个具体的汇总选项, 网页的整体响应速度

我们很想获得开发者和网站所有者的反馈 下面哪个选项最能代表 网页的响应速度。

测量互动延迟时间

回顾一下,First Input Delay (FID) 指标捕获的是 输入延迟时间的延迟时间部分。也就是说, 当用户与页面交互时,直到事件处理脚本被触发时, 运行。

通过这个新指标,我们计划扩大该指标的适用范围,以涵盖整个事件 时长,从 用户初始输入,直到在所有事件处理脚本完成后绘制下一帧 。

我们还计划 互动次数 而非单个事件“互动”是指 作为同一逻辑用户手势(例如: pointerdownclickpointerup)。

衡量一组单个事件的总互动延迟时间 我们正在考虑两种可能的方法:

  • 事件时长上限:互动延迟时间等于最长延迟时间 互动组中任意事件的单个事件时长。
  • 事件总时长:互动延迟时间是所有事件的总和 并忽略所有重叠的情况

例如,下图展示了包含按键交互的 即 keydownkeyup 事件。在本示例中,存在时长重叠的 。要测量按键交互的延迟时间, 我们可以使用 max(keydown duration, keyup duration)sum(keydown duration, keyup duration) - duration overlap

答
显示基于事件时长的互动延迟时间的图表

每种方法各有利弊,我们希望收集更多数据和 反馈,然后再最终确定延迟时间定义。

<ph type="x-smartling-placeholder">。 <ph type="x-smartling-placeholder">

汇总每个网页的所有互动

一旦能够测量出所有互动的端到端延迟时间,接下来, 为网页访问定义一个总分,其中可能包含 一次互动。

在了解了众多选项后,我们缩小了选择范围, 我们在下文中概述的每种策略,目前 如何在 Chrome 中收集真实用户数据我们计划发布 收集到足够的数据后,就能轻松发现新发现,但我们还在研究 获得网站所有者的直接反馈 能最准确地反映其网页上的互动模式。

汇总策略选项

为帮助解释以下各种策略,不妨以一个网页访问示例为例 包括以下四项互动:

互动 延迟时间
点击 120 毫秒
点击 20 毫秒
按键效果 60 毫秒
按键效果 80 毫秒

最差互动延迟时间

网页上发生的最长单个互动延迟时间。由于存在 上面列出的互动示例,则最糟糕的互动延迟时间是 120 毫秒。

预算策略

用户体验 研究 表明用户可能不会认为延迟时间低于特定阈值, 负面。根据此次调研,我们正在考虑多种预算策略 针对每种事件类型使用以下阈值:

互动方式 预算阈值
点击/点按 100 毫秒
拖动 100 毫秒
键盘 50 毫秒

所有这些策略都只会考虑超过 每次互动的预算阈值。以上面的网页访问示例为例, 超出预算的金额如下所示:

互动 延迟时间 超出预算的延迟时间
点击 120 毫秒 20 毫秒
点击 20 毫秒 0 毫秒
按键 60 毫秒 10 毫秒
按键 80 毫秒 30 毫秒

超出预算的最严重互动延迟时间

超出预算的最大单次互动延迟时间。对于上面的示例, 得分为 max(20, 0, 10, 30) = 30 ms

超过预算的总互动延迟时间

预算范围内所有互动延迟时间的总和。对于上面的示例, 得分为 (20 + 0 + 10 + 30) = 60 ms

超出预算的平均互动延迟时间

预算超支的互动总时长除以 互动。对于上面的示例,得分为 (20 + 0 + 10 + 30) / 4 = 15 ms

高分位数近似值

除了计算预算范围内最大的互动延迟时间之外, 也可以考虑使用高分位数近似, 网页经常会进行大量互动, 离群值。我们确定了两种可行的高分位数近似策略 我们喜欢:

  • 方法 1:跟踪 预算。每 50 次新的互动之后, 然后从当前的 50 次互动中选择最大的互动次数。 最终值将是预算范围内最大的剩余互动。
  • 方法 2:计算超过预算的最多 10 次互动,然后选择 具体取决于总互动次数。给定 N 总互动次数,请选择 (N / 50 + 1) 第 1 个最大值或第 10 个值 。

在 JavaScript 中衡量这些选项

以下代码示例可用于确定第一个 上述三种策略请注意,目前还无法衡量 网页上的总互动次数,所以本例并不是 包括预算策略的平均互动数或 分位数近似策略。

const interactionMap = new Map();

let worstLatency = 0;
let worstLatencyOverBudget = 0;
let totalLatencyOverBudget = 0;

new PerformanceObserver((entries) => {
  for (const entry of entries.getEntries()) {
    // Ignore entries without an interaction ID.
    if (entry.interactionId > 0) {
      // Get the interaction for this entry, or create one if it doesn't exist.
      let interaction = interactionMap.get(entry.interactionId);
      if (!interaction) {
        interaction = {latency: 0, entries: []};
        interactionMap.set(entry.interactionId, interaction);
      }
      interaction.entries.push(entry);

      const latency = Math.max(entry.duration, interaction.latency);
      worstLatency = Math.max(worstLatency, latency);

      const budget = entry.name.includes('key') ? 50 : 100;
      const latencyOverBudget = Math.max(latency - budget, 0);
      worstLatencyOverBudget = Math.max(
        latencyOverBudget,
        worstLatencyOverBudget,
      );

      if (latencyOverBudget) {
        const oldLatencyOverBudget = Math.max(interaction.latency - budget, 0);
        totalLatencyOverBudget += latencyOverBudget - oldLatencyOverBudget;
      }

      // Set the latency on the interaction so future events can reference.
      interaction.latency = latency;

      // Log the updated metric values.
      console.log({
        worstLatency,
        worstLatencyOverBudget,
        totalLatencyOverBudget,
      });
    }
  }
  // Set the `durationThreshold` to 50 to capture keyboard interactions
  // that are over-budget (the default `durationThreshold` is 100).
}).observe({type: 'event', buffered: true, durationThreshold: 50});

反馈

我们希望鼓励开发者 。如果您发现任何问题,请告诉我们。

如果您对此处所述的方法有任何一般性反馈,请通过电子邮件发送给 web-vitals-feedback Google 包含“[自适应指标]”的分组。我们真诚期待 期待听到您的想法!