前端性能优化利器:Chrome Timeline学习及实践
来源:互联网 发布:飘零网络验证 编辑:程序博客网 时间:2024/06/05 08:32
Timeline
Chrome相信是绝大部分前端工程师的基础开发调试环境,正所谓,工欲善其事必先利其器,当然这里说的不是打磨Chrome,说的是怎么用好Chrome。
基础介绍
在Chrome里打开(鼠标右键选择检查/Mac下CMD
+option
+i
)开发界面,如上图。简单介绍一下各个tab对应的作用:
- Element:页面元素的选定,实时修改css样式。
- Console:查看程序输出信息。
- Sources:页面的所有资源(HTML文档,js,css,图片)。
- Network:按时间顺序展示了页面加载过程及后续过程的所有网络请求。
- Timeline:最为强大的工具,按时间顺序展示页面加载过程及后续过程的网络请求、页面渲染过程、JS运行时长、页面帧率、CPU/GPU使用情况等。
- Profiles:监控CPU使用情况,内存分配情况等,深入分析阶段会用到。
- Application:以前好像叫Resource,改名了,里面包含service worker,storage,cache相关信息。
- Security:安全相关吧,很少接触,望大神补充。
- Audits:性能优化相关,chrome会重新加载页面并进行评估和给出意见(gzip,缓存等)
- Adblock是自己装的去广告插件,请忽略。
主角出场
上面说的一些相信大家在开发的过程中都非常熟悉(不熟悉的同学自己先去把各个tab点一遍吧,纸上得来终觉浅),下面重点讲一下Timeline。
先上学习资料:
- 使用Chrome DevTools的Timeline和Profiles提高Web应用程序的性能(译文,年代较远,不过分析思路可参考)
- Chrome开发者文档
- 知乎:chrome里的timeline如何使用?
直接上图(在timeline下刷新页面可得):
- 绿色框:监测选项(网络,js执行,截屏,内存,渲染)
- 黄色框:监测内容,依次是FPS,CPU,屏幕截图,网络请求,js执行详情
- 黑色框:选中区域的详情
性能优化
工具终究是为需求服务的,我们的需求是性能优化,那么什么是性能优化,性能优化对初学者来说比较抽象,概念也比较广泛,这里转换概念成确保用户体验,用户体验也不够具体,我们转换成,避免出现用户体验不好的情况,那就是卡。
卡有两种,一种是页面加载慢(主要原因在网络上),看能不能减少加载(压缩,GZIP,缓存,预加载/只加载当前页面资源),另一种是页面帧率低(低于60FPS),会在视觉上有卡顿,从网上找了个DEMO。
基于前面的分析,性能优化在于两点:
1,在timeline中观测页面资源加载情况(时长,顺序),降低页面加载时长。
2,在timeline中观测FPS情况(由上图可知,变红部分是帧率较低,是需要重点优化的地方),这个时候观测底下的JS执行耗时,能分析出哪部分耗时过长,导致帧率下降。
实践
基本原理和操作方式在前面都提及了,这里说说我最近做的一个小优化。
基于timeline的数据,在某一小段我发现:
请注意红色框的内容,Chrome提醒我强制回流会有性能问题,上面那个get innerHeight也引起了我的注意,第一个想法是,因为设置了元素高度造成了回流?
果然:
关于这个什么时候设置高度会导致recalculate styles,我写了个DEMO:具体分析写在了代码里面。
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>innerHeight cause recalculate style</title> </head> <body> <section id="section"> <header>结论</header> <ul> <li>console.log会耗费性能(与打印的内容多少有关),产品上尽量去除</li> <li>监听window.onload会耗费性能</li> <li>获取innerHeight不会导致recalculate</li> <li>页面渲染完成前设置height会导致recalculate</li> <li>页面渲染完成后设置height会导致recalculate</li> </ul> <footer>end</footer> </section> <script> //js会阻塞页面加载,所以下面的脚本不会导致recalculate var section = document.querySelector("#section"); var height = window.innerHeight; section.style.height = height + "px"; //下面脚本执行时页面已渲染完成,再次改变为不同的height会到导致recalculate setTimeout(function() { var section = document.querySelector("#section"); var height = window.innerHeight; section.style.height = height + 20 + "px"; },1000) </script> </body></html>
接下来的事情就很简单了,我只要在页面渲染过程中就指定组件高度,而不是在组件加载完成(页面已经渲染完)再指定组件高度,就不会导致recalculate了。
最近
上面的东西都比较浅显,但深入下去也是深不见底的,想写的东西还很多,暂且当做抛砖引玉。
最近工作经验丰富的同事聊起了前端天花板的问题,我也在思考自己两三年的职业规划,目前的看法是,如果保持好奇心和耐心,可以学习,可以深入的东西很多吧。其实想来这些都比较实在,说点虚的吧。
我还是比较关心自己能创造多大价值,能多大程度上推进社会发展。
“少年,要加油呀。”
- 前端性能优化利器:Chrome Timeline学习及实践
- 页面性能优化的利器 — Timeline
- 页面性能优化的利器 — Timeline
- 页面性能优化的利器—Timeline
- 页面性能优化的利器—Timeline
- 使用 Chrome Timeline 来优化页面性能
- 使用 Chrome Timeline 来优化页面性能
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- Web前端性能优化实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- 前端性能优化最佳实践
- hadoop 与 ssh 免密码设置
- Kinect学习笔记三BodyIndex
- Spring Data jpa
- Mac安装Sass介绍
- 浅谈:国内软件公司为何无法做大做强?
- 前端性能优化利器:Chrome Timeline学习及实践
- 代码整洁之道-注释
- leetcode06_ZigZagConversion
- Flume日志收集分层架构应用实践
- iOS开发之protocol和delegate
- 使用 Java 8 Optional 的正确姿势
- vmware 虚拟机ubuntu设置与securecrt ssh 登录
- Kinect学习笔记四Body
- 大数的任意进制之间的转换(九度OJ题目1080)