前端性能监控指标

简介: 前端性能指标包括白屏时间、首屏时间、用户可操作时间(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
  • 相关文章
    |
    2天前
    |
    数据采集 人工智能 安全
    |
    11天前
    |
    云安全 监控 安全
    |
    3天前
    |
    自然语言处理 API
    万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
    通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
    1002 151
    |
    3天前
    |
    编解码 人工智能 机器人
    通义万相2.6,模型使用指南
    智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
    |
    16天前
    |
    机器学习/深度学习 人工智能 自然语言处理
    Z-Image:冲击体验上限的下一代图像生成模型
    通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
    1698 9
    |
    8天前
    |
    人工智能 自然语言处理 API
    一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
    一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
    642 152
    |
    10天前
    |
    人工智能 安全 前端开发
    AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
    AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
    611 14
    |
    9天前
    |
    人工智能 自然语言处理 API
    Next AI Draw.io:当AI遇见Draw.io图表绘制
    Next AI Draw.io 是一款融合AI与图表绘制的开源工具,基于Next.js实现,支持自然语言生成架构图、流程图等专业图表。集成多款主流大模型,提供智能绘图、图像识别优化、版本管理等功能,部署简单,安全可控,助力技术文档与系统设计高效创作。
    687 151