news 2026/10/13 13:13:14

前端:performance.timing(首屏时间)的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端:performance.timing(首屏时间)的庖丁解牛

performance.timing是浏览器提供的原生性能监控 API,用于精确测量页面加载各阶段耗时。对前端开发者而言,它是诊断首屏性能瓶颈、优化用户体验的黄金标准。


一、API 结构:performance.timing对象

performance.timing是一个只读对象,包含页面加载过程中15+ 个时间戳(单位:毫秒,自 Unix 纪元)。

核心字段(按时间顺序):
字段含义说明
navigationStart导航开始时间所有时间的基准(用户点击链接/回车)
domainLookupStartDNS 查询开始
domainLookupEndDNS 查询结束DNS 耗时 =domainLookupEnd - domainLookupStart
connectStartTCP 连接开始
connectEndTCP 连接结束TCP 耗时 =connectEnd - connectStart
requestStartHTTP 请求开始
responseStartHTTP 响应首字节TTFB(Time To First Byte)=responseStart - navigationStart
responseEndHTTP 响应结束
domLoadingDOM 解析开始
domInteractiveDOM 就绪(可交互)关键:用户可操作时间
domContentLoadedEventEndDOMContentLoaded 事件结束JS 执行完毕
loadEventEndload 事件结束完整页面加载完成

📌注意:

  • performance.timing已废弃(但所有浏览器仍支持);
  • 现代替代:performance.getEntriesByType('navigation')[0](Navigation Timing API Level 2)。

二、首屏时间(First Screen Time)的计算

“首屏时间”无标准定义,但通常指用户看到主要内容的时间。常用三种指标:

1.FP(First Paint)
  • 浏览器首次渲染像素(非白屏);
  • 不包括:默认背景色;
  • 计算:需用PerformancePaintTiming(见下文)。
2.FCP(First Contentful Paint)
  • 首次渲染文本、图片、Canvas 等内容;
  • 行业标准(Google Core Web Vitals);
  • 计算:
    constfcp=performance.getEntriesByName('first-contentful-paint')[0];console.log('FCP:',fcp.startTime);
3.TTI(Time to Interactive)
  • 页面可交互(元素可点击、输入);
  • 计算复杂,需第三方库(如tti-polyfill)。

⚠️performance.timing无法直接获取 FCP/FP,
只能估算:

  • 首屏 ≈domInteractive(DOM 解析完成,CSSOM 就绪);
  • 完全加载 =loadEventEnd - navigationStart。

三、用performance.timing估算关键指标

constt=performance.timing;// 1. DNS 查询耗时constdns=t.domainLookupEnd-t.domainLookupStart;// 2. TCP 连接耗时consttcp=t.connectEnd-t.connectStart;// 3. TTFB(后端响应速度)constttfb=t.responseStart-t.navigationStart;// 4. 内容传输耗时constcontentTransfer=t.responseEnd-t.responseStart;// 5. DOM 解析耗时constdomParse=t.domInteractive-t.responseEnd;// 6. 首屏时间(估算)constfirstScreen=t.domInteractive-t.navigationStart;// 7. 完全加载时间constfullLoad=t.loadEventEnd-t.navigationStart;console.table({dns,tcp,ttfb,contentTransfer,domParse,firstScreen,fullLoad});
典型输出(单位:ms):
指标耗时优化方向
DNS20DNS 预解析(<link rel="dns-prefetch">)
TCP50HTTP/2 + 连接复用
TTFB300PHP 优化、OPcache、DB 查询
DOM 解析200减少 HTML 体积、JS 异步加载

四、实战用法:前端性能监控

1.上报性能数据
window.addEventListener('load',()=>{constt=performance.timing;constfirstScreen=t.domInteractive-t.navigationStart;// 上报到监控系统fetch('/perf-log',{method:'POST',body:JSON.stringify({firstScreen,url:location.href})});});
2.诊断慢页面
  • 若TTFB > 500ms→ 后端问题(PHP/DB);
  • 若DOM 解析 > 500ms→ 前端问题(大 HTML、同步 JS);
  • 若TCP > 100ms→ 网络问题(跨机房、无 CDN)。
3.与后端联动
  • 在 PHP 响应头添加Server-Timing:
    header('Server-Timing: db;dur=150, app;dur=50');
  • 前端通过performance.getEntriesByType('navigation')[0].serverTiming读取。

五、现代替代方案:Navigation Timing Level 2

performance.timing已废弃,推荐使用:

// 获取导航性能(等效于 performance.timing)constnav=performance.getEntriesByType('navigation')[0];// 获取 FCP(首屏内容渲染)constfcp=performance.getEntriesByName('first-contentful-paint')[0];// 获取资源加载详情constresources=performance.getEntriesByType('resource');
优势:
  • 支持FCP、FP、LCP等 Core Web Vitals;
  • 支持Resource Timing(单个 JS/CSS 耗时);
  • 支持Server-Timing(后端自定义指标)。

六、PHP 程序员如何利用?

  1. 监控 TTFB:
    • 若ttfb > 300ms,用xhprof/EXPLAIN优化 PHP/DB;
  2. 减少响应体积:
    • 开启 Gzip:ob_start('ob_gzhandler');
    • 移除无用 HTML/JS;
  3. 利用 Server-Timing:
    // 在 PHP 中标记关键阶段$start=microtime(true);// ... DB 查询 ...$dbTime=(microtime(true)-$start)*1000;header("Server-Timing: db;dur=$dbTime");

七、总结

概念performance.timing现代方案
核心价值测量页面加载各阶段耗时支持 Core Web Vitals
首屏时间估算(domInteractive)精确(FCP/LCP)
TTFB✅ 精确✅ 精确
前端优化指导 HTML/JS 优化指导用户体验优化
后端联动通过 TTFB 定位 PHP/DB 问题通过 Server-Timing 暴露内部耗时

✅对 PHP 程序员的终极价值:
用performance.timing证明:
“慢”不是前端问题,而是后端 TTFB 高
。

掌握此 API,
你就能用数据驱动前后端协作,
而非陷入“甩锅”争论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 12:28:20

Open-Unmix音乐源分离完全指南

Open-Unmix音乐源分离完全指南 【免费下载链接】open-unmix-pytorch Open-Unmix - Music Source Separation for PyTorch 项目地址: https://gitcode.com/gh_mirrors/op/open-unmix-pytorch Open-Unmix是一个基于PyTorch的深度学习工具&#xff0c;专门用于音乐源分离。…

作者头像 李华
网站建设 2026/10/11 3:53:36

基于sbit的IO口控制:嵌入式开发实战案例

点亮第一个LED之后&#xff1a;用 sbit 把51单片机的IO控制玩出效率与优雅 你有没有过这样的经历&#xff1f;在调试一个简单的LED闪烁程序时&#xff0c;明明逻辑没错&#xff0c;可就是发现响应慢半拍&#xff1b;或者在一个多任务系统里&#xff0c;某个继电器莫名其妙地误…

作者头像 李华
网站建设 2026/10/12 13:29:55

使用u8g2显示WiFi连接状态:快速理解教程

用一块OLED屏看清ESP32的Wi-Fi心跳&#xff1a;u8g2实战指南你有没有过这样的经历&#xff1f;把一个基于ESP32的物联网设备部署到墙角、屋顶甚至户外&#xff0c;上电后只靠一盏闪烁的LED判断它是否连上了Wi-Fi。红灯快闪是“正在连接”&#xff1f;慢闪是“认证失败”&#x…

作者头像 李华
网站建设 2026/10/12 13:30:20

HTTP Shortcuts终极指南:Android自动化神器从入门到精通

HTTP Shortcuts终极指南&#xff1a;Android自动化神器从入门到精通 【免费下载链接】HTTP-Shortcuts Android app to create home screen shortcuts that trigger arbitrary HTTP requests 项目地址: https://gitcode.com/gh_mirrors/ht/HTTP-Shortcuts 在Android设备上…

作者头像 李华
网站建设 2026/10/12 8:45:58

ARM处理器上ioctl中断控制项目应用示例

用 ioctl 打通用户态与内核的“任督二脉”&#xff1a;ARM中断控制实战全解析 你有没有遇到过这样的场景&#xff1f;一个简单的GPIO按键&#xff0c;程序却要不断轮询它的电平状态。CPU明明没在干啥大事&#xff0c;负载却居高不下&#xff1b;想快速响应用户按下动作&#…

作者头像 李华
网站建设 2026/10/13 12:28:20

为什么工业界都在用YOLO做目标检测?答案在这里

为什么工业界都在用YOLO做目标检测&#xff1f;答案在这里 在一条每分钟处理上千件包裹的物流分拣线上&#xff0c;摄像头必须在毫秒级时间内判断出每个物体的位置和类别——是手机、书籍还是易碎品&#xff1f;稍有延迟&#xff0c;整个系统就会积压停滞。类似场景遍布现代工厂…

作者头像 李华