前端性能监控指标

简介: 前端性能指标包括白屏时间、首屏时间、可操作时间和总下载时间。可通过注入代码或`window.performance API`进行量化统计,后者更精准,支持DNS、TCP、请求、解析等各阶段耗时计算,提升页面性能优化效率。(239字)
  1. 前端性能统计的指标有哪些?
    白屏时间:从打开网站到有内容渲染出来的时间节点;
    首屏时间:首屏内容渲染完毕的时间节点;
    用户可操作时间节点:domready触发节点;
    总下载时间:window.onload的触发节点。
  2. 如何统计前端的性能(量化统计)?
    下面介绍几种以上几个数据的统计方案。
    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.2.3 统计代码
    ```js // 计算加载时间 function getPerformanceTiming () { var performance = window.performance;
    JavaScript
    运行代码
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    if (!performance) {
    // 当前浏览器不支持
    console.log('你的浏览器不支持 performance 接口');
    return;
    }

var t = performance.timing;
var times = {};

//【重要】页面加载完成的时间
//【原因】这几乎代表了用户等待页面可用的时间
times.loadPage = t.loadEventEnd - t.navigationStart;

//【重要】解析 DOM 树结构的时间
//【原因】反省下你的 DOM 树嵌套是不是太多了!
times.domReady = t.domComplete - t.responseEnd;

//【重要】重定向的时间
//【原因】拒绝重定向!比如,http://example.com/ 就不该写成 http://example.com
times.redirect = t.redirectEnd - t.redirectStart;

//【重要】DNS 查询时间
//【原因】DNS 预加载做了么?页面内是不是使用了太多不同的域名导致域名查询的时间太长?
// 可使用 HTML5 Prefetch 预查询 DNS ,见:HTML5 prefetch
times.lookupDomain = t.domainLookupEnd - t.domainLookupStart;

//【重要】读取页面第一个字节的时间
//【原因】这可以理解为用户拿到你的资源占用的时间,加异地机房了么,加CDN 处理了么?加带宽了么?加 CPU 运算速度了么?
// TTFB 即 Time To First Byte 的意思
// 维基百科:https://en.wikipedia.org/wiki/Time_To_First_Byte
times.ttfb = t.responseStart - t.navigationStart;

//【重要】内容加载完成的时间
//【原因】页面内容经过 gzip 压缩了么,静态资源 css/js 等压缩了么?
times.request = t.responseEnd - t.requestStart;

//【重要】执行 onload 回调函数的时间
//【原因】是否太多不必要的操作都放到 onload 回调函数里执行了,考虑过延迟加载、按需加载的策略么?
times.loadEvent = t.loadEventEnd - t.loadEventStart;

// DNS 缓存时间
times.appcache = t.domainLookupStart - t.fetchStart;

// 卸载页面的时间
times.unloadEvent = t.unloadEventEnd - t.unloadEventStart;

// TCP 建立连接完成握手的时间
times.connect = t.connectEnd - t.connectStart;

return times;

相关文章
|
1天前
|
存储 机器学习/深度学习 编解码
🚀 预训练技巧
预训练是大模型的核心,涵盖混合精度、分布式训练等关键技术。混合精度提升效率与显存利用率;数据、模型、流水线并行协同加速训练;DeepSpeed的ZeRO优化显存,FlashAttention提升注意力计算效率,助力千亿参数模型高效训练。
|
1天前
|
机器学习/深度学习 算法 关系型数据库
🎮 强化学习
强化学习(RL)是一种通过智能体与环境交互,以最大化累积奖励为目标的学习方法。核心要素包括状态、动作、奖励和策略,强调试错与延迟奖励。常见算法如Q-learning、PPO、DPO等,广泛应用于决策优化与大模型对齐人类偏好。
|
1天前
|
机器学习/深度学习 存储 知识图谱
🫗 知识蒸馏
知识蒸馏是一种模型压缩技术,通过将大模型(教师)的知识迁移到小模型(学生),提升小模型性能。核心思想是模仿教师的输出分布或中间特征,常用KL散度和温度机制优化软标签学习,兼顾推理效率与泛化能力,广泛应用于轻量化模型部署。(238字)
|
1天前
|
缓存 算法 C++
⚡ 模型推理加速
大模型推理加速关键技术:KV-Cache减少重复计算,连续批处理提升吞吐,投机解码实现2-3倍加速,结合vLLM等工具优化部署。涵盖算法、系统与硬件协同设计,助力高效落地。
|
1天前
|
算法
🗜️ 模型压缩与量化
模型压缩通过量化、稀疏化、知识蒸馏等技术,减小模型体积与计算开销,提升推理效率。涵盖INT8/INT4量化、GPTQ、SmoothQuant等方法,支持在资源受限设备部署大模型,平衡压缩比、精度与速度。附实战代码与面试要点。
|
1天前
|
安全 C++
📈 模型评估
模型评估涵盖能力、安全与效率三大维度,包括语言理解、知识问答、推理代码等基础能力,对齐性及推理延迟、吞吐量等效率指标。常用MMLU、C-Eval、GSM8K等基准,结合Hugging Face工具实现自动化评估,面试关注幻觉检测、指标设计与人工vs自动权衡。
|
1天前
|
存储 NoSQL 数据库
📚 RAG技术
RAG(检索增强生成)通过结合外部知识库与大模型,提升回答准确率,缓解知识过时与幻觉问题。涵盖密集/混合检索、向量数据库选型及核心组件,附实战代码与面试要点,助力构建高效问答系统。
|
1天前
|
存储 人工智能 JSON
🤖 Agent系统
大模型Agent是具备自主规划、推理、工具调用与记忆能力的智能系统,通过“大脑-感知-行动-记忆”架构实现复杂任务分解与持续交互。支持函数调用与多工具集成,广泛应用于搜索、计算、天气等场景。主流框架如LangChain、AutoGPT、CrewAI等各具特色,适用于原型开发、多Agent协作与企业级应用,是AI进化的关键方向。
|
1天前
|
机器学习/深度学习 存储 数据采集
🔥 高频面试题汇总
本文系统解析大模型核心技术,涵盖Transformer自注意力机制、多头注意力、位置编码原理,详解LLaMA与GPT架构差异,介绍LoRA、ZeRO优化策略及FlashAttention内存优化,提供显存与训练时间估算方法,并探讨幻觉抑制、安全性评估与垂直领域落地路径,助力深入理解与实战应用。(238字)
|
1天前
|
敏捷开发 Java 测试技术
为什么要单元测试
单元测试看似“踩刹车”,实则让开发跑得更快。它提升代码质量、降低维护成本、加速问题定位,是高效研发的基石。通过测试金字塔,以单元测试为地基,助力软件持续迭代与高质交付。