聚焦于 Web 性能指标 TTI

在优化网站性能的过程中,我们经常遇到一个“为指标而优化”的困境。指标并不能真正反映用户体验,而应该最真实地反映用户行为。

在本节中,我们将研究 TTI(Time to Interactive)。在深入探讨这个话题之前,我们先了解一些背景知识。

RAIL 模型

RAIL 是一个以用户为中心的性能模型。每个 web 应用程序在其生命周期中都有四个不同的方面,这些方面以不同的方式影响性能:

a0b72853ba790daca643d08d9e2c4eee.png

1.响应:输入延迟时间(从按下到绘制)小于 100 毫秒。

  • 用户按下一个按钮(例如打开导航)。

2.动画:每帧工作的完成时间(从 JS 到绘制)小于 16 毫秒。

  • 用户滚动页面,拖动手指(例如打开菜单)或看到动画。当拖动时,应用程序的响应应该与手指位置相关(例如下拉刷新,滑动轮播)。此指标仅适用于拖动的连续阶段,而不适用于初始阶段。

3.空闲:主线程 JS 工作被分成不超过 50 毫秒的块。

  • 用户不与页面交互,但主线程应有足够的时间处理下一个用户输入。

4.加载:页面可以在 1000 毫秒内准备就绪。

  • 用户加载页面并看到关键路径内容。

如果你想提高网站的用户体验,RAIL 是一个很好的评估模型。

解释 TTI(Time to Interactive)

TTI 是指应用程序已经可视化渲染并且可以响应用户输入的时间。为了理解 “TTI”,我们需要了解它的计算规则。我们看看下图:

be4dd57f0c385327981e08ae8022c978.png

在官方文档中找到了以下描述:

First Idle 是主线程第一次静止并且浏览器完成第一次有意义绘制的早期标志。

Time to Interactive 是在第一次有意义绘制之后。浏览器的主线程已经静止至少 5 秒,并且没有长任务会阻止立即响应用户输入。

我们可以简单地理解为:

First Idle 是主线程处于静止状态并且浏览器完成了第一次有意义绘制的早期标志;TTI 发生在 FMP 之后,浏览器的主线程保持空闲至少 5 秒,没有任何可能阻止用户交互响应的“长任务”。

长任务

对于“长任务”,我们如图所示:

d340dba10a6ce3263f3c86a92350939b.png

对于用户来说,长任务时间表现为卡顿或滞后,这也是当前糟糕的网络体验的主要根源。

如何测量长任务?

const observer = new PerformanceObserver((list) => {for (const entry of list.getEntries()) {// TODO...console.log(entry);}
});observer.observe({entryTypes: ['longtask']});

控制台输出如下:

{"name": "self","entryType": "longtask","startTime": 315009.59500001045,"duration": 99.9899999878835,"attribution": [{"name": "unknown","entryType": "taskattribution","startTime": 0,"duration": 0,"containerType": "window","containerSrc": "","containerId": "","containerName": ""}]
}

长任务 API 可以将任何超过 50 毫秒的任务标记为潜在问题,并向应用程序开发人员展示这些任务。选择 50 毫秒是为了确保应用程序满足 RAIL 性能准则,即在 100 毫秒内响应用户输入。

在实际开发中,我们可以使用一种 hack 方法来检查页面代码中的“长任务”:

// 检测长任务 hack
(function detectLongFrame() {let lastFrameTime = Date.now();requestAnimationFrame(function() {let currentFrameTime = Date.now();if (currentFrameTime - lastFrameTime > 50) {// 在这里报告长帧...}detectLongFrame(currentFrameTime);});
}());
如何计算 TTI?

在计算之前,我们先看看 Timing API:

2bf0924314f1bdd7890a0263aa2f2616.png

在官方的 Google 文档中,有如下描述:

注意:DOM 交互完成后的最小 FMP 值 DOM 交互完成是所有 DOMContentLoaded 监听器执行完毕的时间点。通常,页面的关键事件监听器很少在此时间点之前安装。我们实验的一些 firstInteractive 定义只查看长任务和网络活动(而不是查看安装了多少事件监听器),有时在加载的前 5-10 秒内没有长任务,我们会在 FMP 时触发 FirstInteractive,而此时网站通常还没有准备好处理用户输入。我们发现,如果我们将 max(DOMContentLoadedEnd, firstInteractive) 作为最终的 firstInteractive 值,返回的值在合理范围内。等待 DOMContentLoadedEnd 来声明 FirstInteractive 是合理的,因此所有下面介绍的定义都在 DOMContentLoadedEnd 时降低了 firstInteractive 的下限。

因此,我们可以大致估算使用 domContentLoadedEventEnd

TTI: domContentLoadedEventEnd - navigationStart,

domContentLoadedEventEnd: 文档 DOMContentLoaded 事件结束的时间。

domContentLoadedEventEnd 属性必须返回一个具有时间值的 DOMHighResTimeStamp,该值等于当前文档的 DOMContentLoaded 事件完成后的时间。

如果你觉得上述计算过于复杂,可以使用 Google 提供的 Polyfill 来获取。

TTI 指标监控

我们可以使用 Google TTI Polyfill 监控 TTI。

npm install tti-polyfill

使用

import ttiPolyfill from './path/to/tti-polyfill.js';ttiPolyfill.getFirstConsistentlyInteractive(opts).then((tti) => {// 使用 `tti` 值进行一些操作。
});
结论

通过研究 TTI,我们可以更好地理解如何提高网页的交互性能。RAIL 模型为评估用户体验提供了一个框架,而 TTI 则是衡量网页何时可以交互的重要指标。通过检测和优化长任务,我们可以显著改善用户体验,并确保网页在加载后尽快变得可交互。

最后:

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146361.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

信奥初赛解析:1-3-计算机软件系统

知识要点 软件系统是计算机的灵魂。没有安装软件的计算机称为“裸机”,无法完成任何工作硬件为软件提供运行平台。软件和硬件相互关联,两者之间可以相互转化,互为补充 计算机软件系统按其功能可分为系统软件和应用软件两大类 一、系统软件 系统软件是指…

HTTP中的event-stream,eventsource,SSE,chatgpt,stream request,golang

我们都知道chatgpt是生成式的,因此它返回给客户端的消息也是一段一段的,所以普通的HTTP协议无法满足,当然websocket是能满足的,但是这个是双向的通信,其实 SSE(Server-Sent Events) 正好满足这个…

【操作教程】视频监控系统EasyCVR视频汇聚管理平台如何添加用户和角色?

视频监控平台/视频监控系统EasyCVR视频汇聚管理平台以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。通过简单的配置和操作,用户可以轻松地进行远程视频监控、存储和查看&#xf…

永磁同步电机谐波抑制算法(8)——基于神经网络的傻瓜式(无需知道谐波频率)谐波抑制

1.简介 前面的内容已经介绍了很多谐波抑制的方法:多同步、PIR、陷波器等等。也介绍了比较多的谐波来源:死区(5、7、11、13等次相电流谐波)、绕组不对称(基波不等幅值、3次相电流谐波)等等。 上述的方法都…

vue3集成google第三方登陆

网上资源很多,但乱七八糟,踩坑几小时后,发现下面的方式没问题。 npm install vue3-google-login 插件文档:vue3-google-登录 (devbaji.github.io) 修改main.js import ./assets/main.css import { createApp } from vue impor…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时,通常会使用xxljob容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服…

结构体、共用体、Makefile

一、结构体 1.1 结构体变量的初始化和赋值的方式 struct Student{int id;char name[32];int score; } struct Student s; s.id 1001; strcpy(s.name,"zhangsan"); s.score 98; struct Student{int id;char name[32];int score; }s; s.id 1001; strcpy(s.name,&…

数据清洗与预处理:从网页中提取的数据处理技术

目录 引言 一、数据清洗与预处理概述 1.1 数据清洗的定义 1.2 数据清洗的重要性 二、数据清洗与预处理的步骤 2.1 数据获取 2.2 数据去重 2.3 缺失值处理 2.4 异常值处理 2.5 数据格式化与标准化 2.6 数据转换与编码 2.7 数据整合与关联 2.8 数据可视化 三、技术…

C++11——function与bind

包装器 function包装器function的介绍function的使用function的使用场景function的意义 bind包装器bind的介绍bind的使用 function包装器 function的介绍 function是用来包装函数的,所以叫做包装器或者适配器,fuction的本质其实是一个类模板。 functio…

基于多域名,通过云运营商弹性负载,Nginx配置等基于的多租户系统部署

已经开发好久的系统,因为业务上没有需求,没有做上线部署,此系统为多租户系统,原来设计是通过租户码参数来识别的,每个租户访问,需要传自己的码过来,才能确定是哪个租户登录系统, 今…

数据结构和算法之树形结构(1)

文章出处: 数据结构和算法之树形结构(1) 关注码农爱刷题,看更多技术文章!! 树形结构是数据结构四种逻辑结构之一,也是被广泛使用的一种逻辑结构,它描述的是数据元素之间一对多的逻辑关系。树是一种非线性的数据结构&a…

SOMEIP_ETS_119: SD_Indicate_wrong_l4proto_param

测试目的: 验证DUT能够拒绝一个引用了带有错误l4proto参数(既不是UDP也不是TCP)的IPv4端点选项的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接…

基于单片机的智能电话控制系统设计

摘要: 为了能够使用电话实现电器设备的控制,文中通过单片机及双音多频解码集成电路,使用用 户通过电话输入相应的指令就能够实现远程设备的智能化控制。文章主要对系统的构成、软件及 硬件设计进行了简单的介绍,并且对其中的电路…

出现conda不是内部或外部命令,也不是可运行的程序或批处理文件。的解决办法

发现是我的环境变量不对,需要改成conda.exe所在的目录下 如果不知道自己conda.exe在哪的 可以下载个everything这个软件 找东西很快 找到后 点击环境变量-系统变量-Path-新建-(你的conda.exe所在目录:绝对路径) 完成上述操作…

Day4:杨辉三角

题目&#xff1a;给定一个非负整数numRows,生成杨辉三角的前numRows行。在杨辉三角中&#xff0c;每个数就是左上方和右上方数的和。 import java.util.ArrayList; import java.util.List;public class Test {public static List<List<Integer>> generate(int numR…

【学术会议征稿】2024年先进控制系统与自动化技术国际学术会议(ACSAT 2024)

2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09; 2024 International Conference on Advanced Control Systems and Automation Technologies 2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09;将于2024年11月15…

solidwork装配体取消零件固定

前面有固定导致零件移动不了 右键&#xff0c;找到浮动

Three.js 3D人物漫游项目(上)

本文目录 前言1、项目构建1.1 安装依赖1.2 初始化1.3 项目结构1.4 初始化的项目运行 2、加载模型2.1 threejs三要素2.1.1 代码解读 2.2 加载模型2.2.1 代码解读 2.3 效果 前言 在数字技术的浪潮中&#xff0c;三维图形渲染技术以其独特的魅力&#xff0c;正逐步渗透到我们生活的…

react hooks--useMemo

概述 相当于计算属性!!! useMemo实际的目的也是为了进行性能的优化。 ◼ 如何进行性能的优化呢&#xff1f;  useMemo返回的也是一个 memoized&#xff08;记忆的&#xff09; 值&#xff1b;  在依赖不变的情况下&#xff0c;多次定义的时候&#xff0c;返回的值是相同…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库&#xff1a;https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明&#xff1a; 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…