当前位置: 首页 > news >正文

Window Performance API

文章目录

  • 前言
      • Window Performance API 详细分析
      • **1. 主要接口**
        • **1.1 `performance.now()`**
        • **1.2 `performance.mark()`**
        • **1.3 `performance.measure()`**
        • **1.4 `performance.getEntriesByType()`**
        • **1.5 `performance.getEntriesByName()`**
        • **1.6 `performance.clearMarks()` 和 `performance.clearMeasures()`**
      • **2. 应用场景**
        • **2.1 网页加载时间的分析**
        • **2.2 资源加载时间的监控**
        • **2.3 用户交互性能分析**
      • **3. 在实际项目中的应用**
        • **3.1 性能监控与优化**
        • **3.2 用户体验优化**
        • **3.3 基准测试**
        • **3.4 持续监控与告警**
      • **总结**


前言

Window Performance API 详细分析

Window Performance API 是一组浏览器提供的接口,用于收集和分析网页性能数据。它允许开发者精确地测量网页加载时间、资源加载时间、用户交互延迟等性能指标,从而优化用户体验。

1. 主要接口

1.1 performance.now()
  • 返回一个高精度时间戳,通常用于计算精确的时间差。例如,你可以用它来测量函数执行时间。
  • 使用场景: 精确计算代码段的执行时间。
const start = performance.now();
// 执行某个任务
const end = performance.now();
console.log(`执行时间: ${end - start} 毫秒`);
1.2 performance.mark()
  • 用于在浏览器的性能时间线中创建一个标记。这些标记可以用来测量特定时间点到另一个时间点的间隔。
  • 使用场景: 标记应用程序中的重要事件,如用户点击按钮的时间点。
performance.mark('start-task');
// 执行任务
performance.mark('end-task');
1.3 performance.measure()
  • 在两个标记之间创建一个度量,并将结果保存到浏览器的性能入口中。
  • 使用场景: 测量两个标记之间的时间间隔。
performance.mark('start-task');
// 执行任务
performance.mark('end-task');
performance.measure('Task Duration', 'start-task', 'end-task');
1.4 performance.getEntriesByType()
  • 获取所有指定类型的性能条目,比如 “mark”, “measure”, “resource” 等。
  • 使用场景: 获取页面加载时的所有资源请求时间。
const measures = performance.getEntriesByType('measure');
measures.forEach((measure) => {console.log(`Name: ${measure.name}, Duration: ${measure.duration}`);
});
1.5 performance.getEntriesByName()
  • 按名称获取性能条目。这通常与 markmeasure 一起使用。
  • 使用场景: 获取特定标记的性能信息。
const measure = performance.getEntriesByName('Task Duration')[0];
console.log(`Task Duration: ${measure.duration} ms`);

伪代码:
在这里插入图片描述

1.6 performance.clearMarks()performance.clearMeasures()
  • 用于清除所有标记或度量。常用于防止内存泄漏,或者当你不再需要这些数据时使用。
  • 使用场景: 在重复操作中清理标记和度量。
performance.clearMarks('start-task');
performance.clearMarks('end-task');
performance.clearMeasures('Task Duration');

2. 应用场景

2.1 网页加载时间的分析

使用 Performance Timing API 来分析整个网页加载过程中的各个阶段,如 DNS 解析时间、TCP 连接时间、页面渲染时间等。performance.timing 对象提供了一个详细的时间戳列表。

const timing = performance.timing;
const pageLoadTime = timing.loadEventEnd - timing.navigationStart;
console.log(`页面加载时间: ${pageLoadTime} ms`);
2.2 资源加载时间的监控

通过 performance.getEntriesByType('resource') 可以获取页面中所有资源(如脚本、图片、CSS 等)的加载时间,从而找出哪些资源加载时间过长。

const resources = performance.getEntriesByType('resource');
resources.forEach((resource) => {console.log(`Resource: ${resource.name}, Duration: ${resource.duration} ms`);
});
2.3 用户交互性能分析

使用 performance.now()performance.mark() 来测量用户操作(如按钮点击)与页面响应之间的时间差,从而优化页面的响应速度。

document.querySelector('button').addEventListener('click', () => {performance.mark('button-click');// 假设这里有一些操作performance.mark('end-button-click');performance.measure('Button Click Response Time', 'button-click', 'end-button-click');const measure = performance.getEntriesByName('Button Click Response Time')[0];console.log(`按钮点击响应时间: ${measure.duration} ms`);
});

3. 在实际项目中的应用

3.1 性能监控与优化
  • 通过分析 performance 数据,你可以了解页面加载的瓶颈在哪里。例如,资源加载时间过长可能意味着需要引入资源压缩,或者采用懒加载策略。
3.2 用户体验优化
  • 通过测量用户交互与页面响应的时间差,开发者可以确保在用户执行某个操作后,页面可以迅速做出响应,从而提高用户体验。
3.3 基准测试
  • 在开发过程中,使用 performance API 来进行基准测试。例如,在优化代码前后,通过 performance.now() 来比较执行时间,从而衡量优化效果。
const measurePerformance = (fn) => {const start = performance.now();fn();const end = performance.now();console.log(`执行时间: ${end - start} 毫秒`);
};measurePerformance(() => {// 被测代码
});
3.4 持续监控与告警
  • 将性能数据持续收集并上报到监控系统中,结合实际业务指标,自动生成告警规则。例如,当页面加载时间超过设定阈值时触发告警。

总结

Window Performance API 提供了一整套全面的工具来帮助开发者测量和优化网页性能。通过有效地使用这些接口,开发者不仅可以了解用户在使用应用程序时的实际体验,还可以针对性的做出优化,提升整个应用的响应速度和稳定性。在实际项目中,合理地使用这些 API 并将它们集成到持续监控系统中,可以大大提高应用的质量和用户满意度。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 苹果机器人计划:能否成为智能家居的破局者?
  • MyBatis查询 ▎修改 ▎删除
  • postman请求设置
  • 对接微信小程序授权登录
  • qt处理表格,Qtxlsx库文件的安装以及导入
  • Python 点云ISS关键点提取算法
  • 文本向量化的六种常见模式
  • Spark MLlib模型训练—分类算法Multinomial Logistic Regression
  • SAP 表格设置全部隐藏后的恢复问题
  • Centos服务器配置使用密钥登录
  • oracle 重做日志(Redo LogBuffer)
  • uni-app开发日志:schema2code生成的新增页和修改页因字段太多用分段器实现分段分类
  • 【iOS端】基于Uniapp跨平台接入即构RTC+相芯美颜
  • 使用 Python TorchRL 进行多代理强化学习
  • 【AI大模型】提示词(Prompt)全面解析
  • Android 控件背景颜色处理
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • flutter的key在widget list的作用以及必要性
  • gulp 教程
  • JS 面试题总结
  • php ci框架整合银盛支付
  • Phpstorm怎样批量删除空行?
  • Python - 闭包Closure
  • Python学习之路16-使用API
  • Redis字符串类型内部编码剖析
  • Vue ES6 Jade Scss Webpack Gulp
  • 编写符合Python风格的对象
  • 简单基于spring的redis配置(单机和集群模式)
  • 聚类分析——Kmeans
  • 区块链分支循环
  • 如何编写一个可升级的智能合约
  • 手机端车牌号码键盘的vue组件
  • 小程序开发之路(一)
  •  一套莫尔斯电报听写、翻译系统
  • 赢得Docker挑战最佳实践
  • 原生Ajax
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 我们雇佣了一只大猴子...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​zookeeper集群配置与启动
  • ​人工智能书单(数学基础篇)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C语言)球球大作战
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (第27天)Oracle 数据泵转换分区表
  • (十六)一篇文章学会Java的常用API
  • (四)软件性能测试
  • (转)大道至简,职场上做人做事做管理
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)Google Chrome调试JS
  • (转载)Linux 多线程条件变量同步
  • (转载)OpenStack Hacker养成指南
  • ..回顾17,展望18
  • .NET CLR基本术语