【Chrome火焰图性能分析】

Chrome页面性能分析

遇到的问题

背景是我们组项目接入了sentry用来监控首屏打开的时间。但是在统计数据和打开速度上存在不一致的情况,sentry监控首屏时间会在一到两秒,但是实际打开页面到最后一个接口调用从视觉感受上不会超过一秒。

分析过程

下面是sentry监控的时间图
在这里插入图片描述
可以看出在url/report/list 前后均有一大段的留白部分,然后通过浏览器控制台性能监控url/report/list后面的火焰图
在这里插入图片描述
可以看到这个接口调用之后有很长一段时间都在执行js脚本
在这里插入图片描述
查看里面自身耗时最长的js调用是querySelectorAll方法。ok这就引出了我们的另一个sdk项目,数据加解密。
因为领导需要,要对页面上展示的一些敏感信息进行加解密处理,也就是过来展示在页面上的不能是明文。所以最初设计的思路是前端设计一个sdk,通过拦截请求携带特殊的请求头信息来通知网关进行加密处理,前端则通过 MutationObserver 开启对document及其后代变化的观察,以判断满足 textNode.nodeValue 命中某个正则之后进行可解密dom的替换操作。但是因为接口的复用,有些数据在下拉枚举中或者输入框的回显中也被替换成加解密之后的dom了,因此需要对这部分做自动解密的操作,所以引出了这个现状的罪魁祸首
在这里插入图片描述
这里的逻辑是通过判定当前帧内所剩余的可使用的空闲时间,然后触发空闲回调逻辑,然后查询页面所有的对应标签选择器的dom然后进行自动解密的操作,从目前的现状看就是sentry把后续的空闲回调时间也记录到主线程阻塞时间中了。目前把开发环境的加密逻辑下掉可以看出时间是正常的了。
在这里插入图片描述

改进建议

后续的改进想法,第一个就是将这部分自动解密的逻辑改到观察者回调逻辑当中,或者将这里空闲回调的触发变成可控的而不是空闲时一直回调的情况。

### Chrome DevTools 性能面板使用教程 Chrome DevTools 的 Performance 面板是一个强大的工具,能够帮助开发者深入分析页面的性能表现。通过记录和分析页面运行时的所有活动,可以优化加载速度、渲染效率以及 JavaScript 执行性能。 #### 一、打开 Performance 面板并开始录制 在 Chrome 浏览器中,按下 `F12` 或右键点击页面选择“检查”,然后切换到 **Performance** 标签页。该面板包含多个功能控件: - **Record(录制)**:点击开始录制按钮(或按 `Ctrl + E`),录制过程中按钮变为红色,再次点击停止录制。 - **Clear(清除)**:清除当前的性能分析结果。 - **Screenshots(屏幕截)**:显示每个时间段的界面变化,有助于识别视觉上的性能瓶颈。 - **Memory(内存)**:跟踪内存使用情况,查看不同时间点的内存分配与回收。 - **Network(网络)**:模拟不同的网络环境,便于在特定条件下测试页面加载表现。 - **CPU(处理器)**:模拟不同 CPU 速度,用于评估低端设备上的性能体验 [^2]。 #### 二、执行性能分析 录制完成后,Performance 面板会展示详细的性能时间线,主要包括以下几个部分: - **Overview(概览)**:显示 FPS(帧率)、CPU 使用率和网络请求的时间轴,帮助快速判断是否存在卡顿或资源过载问题。 - **Flame Chart(火焰)**:以可视化方式展示函数调用栈及其执行时间,每一层代表一个事件循环中的任务,宽度表示耗时长短。 - **Call Tree(调用树)**:列出所有函数调用及其子调用所消耗的时间,便于定位性能瓶颈。 - **Bottom-Up(自底向上)视**:按照函数自身的执行时间排序,适合查找最耗时的函数 [^2]。 #### 三、优化建议与资源优先级 在进行前端性能优化时,需要注意浏览器对资源加载的优先级顺序: - **最高优先级**:HTML、CSS、字体预加载(fontpreload) - **次高优先级**:脚本(script)、XHR 请求 - **较低优先级**:片、音视频等资源 - **最低优先级**:预取资源(prefetch) 利用 `<link rel="preload">` 可以提升关键资源的加载优先级,从而加快首屏渲染速度 [^3]。 #### 四、示例代码:使用 `performance.now()` 记录执行时间 ```javascript const start = performance.now(); // 模拟一段耗时操作 for (let i = 0; i < 1000000; i++) { // do something } const end = performance.now(); console.log(`执行耗时: ${end - start} 毫秒`); ``` 此代码片段展示了如何使用 `performance.now()` 来测量 JavaScript 执行时间,适用于手动插入性能标记以辅助分析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值