前端性能监控指标

简介: 前端性能指标包括白屏时间、首屏时间、用户可操作时间(DOM Ready)和总下载时间(onload)。可通过注入代码或使用 `window.performance` API 进行量化统计。传统方法依赖代码埋点,数据为估值;而 `performance.timing` API 可精准获取DNS、TCP、请求、解析等各阶段耗时,进而计算出各项性能指标,是现代浏览器推荐的性能监控方案。
  1. 前端性能统计的指标有哪些?
  2. 白屏时间:从打开网站到有内容渲染出来的时间节点;
  3. 首屏时间:首屏内容渲染完毕的时间节点;
  4. 用户可操作时间节点:domready触发节点;
  5. 总下载时间:window.onload的触发节点。
  6. 如何统计前端的性能(量化统计)?
    下面介绍几种以上几个数据的统计方案。
    2.1 常规统计方案
    使用注入代码监控的方式统计以上指标,在没有一些浏览器新API(如下文将提到的timing API)的支持下,得到的数据大都是估值,虽然不准确,但也有一定的参考价值。
    2.1.1 白屏时间
    白屏时间节点指的是从用户进入网站(输入url、刷新、跳转等方式)的时刻开始计算,一直到页面有内容展示出来的时间节点。这个过程包括dns查询、建立tcp连接、发送首个http请求(如果使用https还要介入TLS的验证时间)、返回html文档、html文档head解析完毕。
    使用注入代码监控无法获取解析html文档之前的时间信息,目前普遍使用的白屏时间统计方案是在html文档的head中所有的静态资源以及内嵌脚本/样式之前记录一个时间点,在head最底部记录另一个时间点,两者的差值作为白屏时间。如下:










上述代码中的end_time和start_time的差值一般作为白屏时间的估值,但理论上来讲,这个差值只是浏览器解析html文档head的时间,并非准确的白屏时间。
2.1.2 首屏时间
首屏时间的统计比较复杂,目前应用比较广的方案是将首屏的图片、iframe等资源添加onload事件,获取最慢的一个。
这种方案比较适合首屏元素数量固定的页面,比如移动端首屏不论屏幕大小都展示相同数量的内容,响应式得改变内容的字体、尺寸等。但是对于首屏元素不固定的页面,这种方案并不适用,最典型的就是PC端页面,不同屏幕尺寸下展示的首屏内容不同。上述方案便不适用于此场景。
2.1.3 可操作时间
用户可操作的时间节点即dom ready触发的时间,使用jquery可以通过$(document).ready()获取此数据,如果不使用jQuery可以参考这里通过原生方法实现dom ready。
2.1.4 总下载时间
Note
总下载时间即window.onload触发的时间节点。
目前大多数web产品都有异步加载的内容,比如图片的lazyload等。如果总下载时间需要统计到这些数据,可以借鉴AOP的理念,在请求异步内容之前和之后分别打点,最后计算差值。不过通常来讲,我们说的总下载时间并不包括异步加载的内容。
2.2 使用window.performance API
Note
window.performance 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持。
一个performance对象的完整结构包括:
  • memory字段代表JavaScript对内存的占用。
  • navigation字段统计的是一些网页导航相关的数据:
  • redirectCount:重定向的数量(只读),但是这个接口有同源策略限制,即仅能检测同源的重定向;
  • type 返回值应该是0,1,2 中的一个。分别对应三个枚举值:
    ○ 0 : TYPE_NAVIGATE (用户通过常规导航方式访问页面,比如点一个链接,或者一般的get方式)
    ○ 1 : TYPE_RELOAD (用户通过刷新,包括JS调用刷新接口等方式访问页面)
    ○ 2 : TYPE_BACK_FORWARD (用户通过后退按钮访问本页面) 最重要的是timing字段的统计数据,它包含了网络、解析等一系列的时间数据。
    2.2.1 timing API
    timing的整体结构包括:

  • startTime:有些浏览器实现为navigationStart,代表浏览器开始unload前一个页面文档的开始时间节点。比如我们当前正在浏览baidu.com,在地址栏输入google.com并回车,浏览器的执行动作依次为:unload当前文档(即baidu.com)->请求下一文档(即google.com)。navigationStart的值便是触发unload当前文档的时间节点。
    ○ 如果当前文档为空,则navigationStart的值等于fetchStart。

  • redirectStart和redirectEnd:如果页面是由redirect而来,则redirectStart和redirectEnd分别代表redirect开始和结束的时间节点;
  • unloadEventStart和unloadEventEnd:如果前一个文档和请求的文档是同一个域的,则unloadEventStart和unloadEventEnd分别代表浏览器unload前一个文档的开始和结束时间节点。否则两者都等于0;
  • fetchStart是指在浏览器发起任何请求之前的时间值。在fetchStart和domainLookupStart之间,浏览器会检查当前文档的缓存;
  • domainLookupStart和domainLookupEnd分别代表DNS查询的开始和结束时间节点。如果浏览器没有进行DNS查询(比如使用了cache),则两者的值都等于fetchStart;
  • connectStart和connectEnd分别代表TCP建立连接和连接成功的时间节点。如果浏览器没有进行TCP连接(比如使用持久化连接webscoket),则两者都等于domainLookupEnd;
  • secureConnectionStart:可选。如果页面使用HTTPS,它的值是安全连接握手之前的时刻。如果该属性不可用,则返回undefined。如果该属性可用,但没有使用HTTPS,则返回0;
  • requestStart代表浏览器发起请求的时间节点,请求的方式可以是请求服务器、缓存、本地资源等;
  • responseStart和responseEnd分别代表浏览器收到从服务器端(或缓存、本地资源)响应回的第一个字节和最后一个字节数据的时刻;
  • domLoading代表浏览器开始解析html文档的时间节点。我们知道IE浏览器下的document有readyState属性,domLoading的值就等于readyState改变为loading的时间节点;
  • domInteractive代表浏览器解析html文档的状态为interactive时的时间节点。domInteractive并非DOMReady,它早于DOMReady触发,代表html文档解析完毕(即dom tree创建完成)但是内嵌资源(比如外链css、js等)还未加载的时间点;
  • domContentLoadedEventStart:代表DOMContentLoaded事件触发的时间节点:
  • 页面文档完全加载并解析完毕之后,会触发DOMContentLoaded事件,HTML文档不会等待样式文件,图片文件,子框架页面的加载(load事件可以用来检测HTML页面是否完全加载完毕(fully-loaded))。
  • domContentLoadedEventEnd:代表DOMContentLoaded事件完成的时间节点,此刻用户可以对页面进行操作,也就是jQuery中的domready时间;
  • domComplete:html文档完全解析完毕的时间节点;
  • loadEventStart和loadEventEnd分别代表onload事件触发和结束的时间节点
    2.2.2 计算性能指标
    Note
    可以使用Navigation.timing 统计到的时间数据来计算一些页面性能指标,比如DNS查询耗时、白屏时间、domready等等。
    ● DNS查询耗时 = domainLookupEnd - domainLookupStart
    ● TCP链接耗时 = connectEnd - connectStart
    ● request请求耗时 = responseEnd - responseStart
    ● 解析dom树耗时 = domComplete - domInteractive
    ● 白屏时间 = domloadng - fetchStart
    ● domready时间 = domContentLoadedEventEnd - fetchStart
    ● onload时间 = loadEventEnd - fetchStart
  • 相关文章
    |
    3月前
    |
    缓存 前端开发 JavaScript
    头条面经
    涵盖前端、网络、JS核心、框架及算法等多方面知识,包括深拷贝、双向绑定、HTTP缓存、跨域、Vue原理、TCP/UDP、设计模式、事件循环、类型判断、闭包、原型链、性能优化等高频面试题,全面考察技术深度与综合能力。
    |
    3月前
    |
    网络协议 算法 前端开发
    架构设计:设计一个灵活的 RPC 框架
    本文回顾了RPC通信原理,详解其核心架构设计:通过传输、协议、引导与服务发现等模块实现远程调用。同时引入插件化架构,提升框架可扩展性与维护性,助力构建灵活、健壮的RPC系统。(238字)
    |
    3月前
    |
    存储 算法 搜索推荐
    线性结构检索:从数组和链表的原理初窥检索本质
    本课探讨数组与链表的检索原理。数组连续存储,支持随机访问,适合二分查找,效率为O(log n);链表非连续存储,检索需遍历,效率为O(n),但插入删除更高效。通过理解二者存储特性对检索的影响,掌握“合理组织数据以缩小查询范围”的核心思想,并学会改造链表等结构优化性能,为深入学习高级检索技术打下基础。(238字)
    |
    前端开发 JavaScript 搜索推荐
    一文 Next / React / SSR / SSG / CSR 扫盲
    一文 Next / React / SSR / SSG / CSR 扫盲
    651 6
    |
    Web App开发 存储 移动开发
    前端基础(十七)_HTML5新特性
    本文概述了HTML5的关键新特性,包括canvas图形绘制、多媒体的`video`和`audio`元素、本地存储功能、语义化标签(如`header`、`footer`、`nav`等)及其新增表单控件和属性(如`url`、`email`、`date`类型输入框等)。这些改进增强了网页的功能性和用户体验。
    309 1
    前端基础(十七)_HTML5新特性
    |
    JavaScript
    Vue3基础(19)___vite.config.js中配置路径别名
    本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
    806 0
    Vue3基础(19)___vite.config.js中配置路径别名
    |
    Java
    vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
    vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
    965 1
    |
    算法 Java
    垃圾回收机制
    垃圾回收是自动内存管理机制,用于检测和回收不再使用的内存资源,防止泄漏和浪费。主要算法包括:标记-清除、引用计数(难以处理循环引用)、分代回收(基于对象生命周期)、增量回收(减少应用停顿时间)和并发回收(同时执行回收和应用)。不同语言和环境选择不同策略,垃圾回收性能直接影响程序内存管理和执行效率。
    |
    前端开发 JavaScript C++
    CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
    CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
    3072 0