快速定位网站性能问题,提前下班!

大家好,我是小雨小雨,致力于分享有趣的、实用的技术文章。

内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步。

分享不易,希望能够得到大家的支持和关注。

查看network时间

直接来一张大图你怕不怕?哈哈

咱们先看看谷歌浏览器network中waterfall各字段的含义哈。简单看下就成,用到了再查不耽误的。

  • Queueing: 排队时间,比如出现以下几种情况的时候,将进入排队

    1. 当前请求前有优先级更高的其他请求
    2. HTTP的1.0和1.1版本中,如果对一个域发送超过六个请求,那么之后的请求需要等待之前请求处理完毕,这是浏览器对tcp连接数的限制。我们可以将资源托管到不同域下来缓解
    3. 浏览器在进行其他操作,比如分配硬盘内存
  • Stalled: 发送请求之前等待的时间。它可能因为进入队列的任意原因而被阻塞。这个时间包括代理协商的时间
  • DNS Lookup: dns解析时间。线路为: 浏览器缓存 => 操作系统缓存 => 路由器缓存 => 本地hosts文件 => dns服务器
  • Waiting (TTFB): 浏览器从发送请求到接收到服务器第一个字节的时间,全拼: Time To First Byte,包含这几个操作: DNS解析 + TCP三次握手 + HTTP请求 + 第一字节返回
  • Content Download: 内容下载时间
非 常用
  • ssl: ssl握手时间
  • Proxy negotiation: 代理协商时间
  • Request sent: 发送请求这一操作所花费的时间,一般情况下很短
  • ServiceWorker Preparation: service worker启动时间
  • Request to ServiceWorker: 请求发送到service worker的时间
  • Receiving Push: 收到服务端发送的数据的时间(http2.0支持)
  • Reading Push: 读取之前缓存的服务器推送的数据的时间(http2.0支持)

Queueing&TTFB

让浏览器说话

常见的一个问题是:说说从输入url到浏览器页面展示这个流程,这次,只说浏览器接收到html后,浏览器做了什么,并且是让浏览器自己说,我们就看着。

下面实例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./normal.js"></script>
    <script defer src="./defer.js"></script>
    <script async src="./async.js"></script>
    <script>
        document.addEventListener(‘DOMContentLoaded‘, function fengshiyu () {
            const box = document.querySelector(‘.box‘);
            const arr = new Array(1000).fill(1);
            let vDom = ‘‘;

            arr.forEach((a, i) => {
                vDom += `<p>${i}</p>`;
            });

            box.innerHTML = vDom;
        });
    </script>
</head>
<body>
    <img src="./aCxZpaq.png" alt="">
    <div class="box"></div>
    <h1>你哈哈哦</h1>
</body>
</html>

其中三个js文件都是近乎一样的内容

const deferArr = new Array(1000).fill(2);

deferArr.forEach((element, i) => {
    console.log(i, element);
});

node启动服务去服务这几个文件,然后我们听浏览器说吧~

从这开始,我就不是小雨了,我是浏览器,记住,我是浏览器!

大家好,我是浏览器,刚才小雨用我访问了一个页面,服务器大哥已经把内容返回给我了,我现在要给小雨展示出来。

上performance(谷歌浏览器开发者工具performance面板)~

首先,我得看看html里都有啥(逐行消化解析)。

我看到了有html,有head,诶还有几个script,那我得根据情况暂停一下了,不能憨憨一样一直往下看,不然这几个js要是操作dom了,那我不白渲染了吗?

那我就先加载这几个script吧,等等,小雨这个货居然还加deferasync,那就按我的规则来吧,我先把这三个script下载一下,对于deferasync可以与html解析并行执行,下载完之后,除了defer外,我都得立刻执行,不敢有丝毫犹豫。defer呢,我得在document解析完,并在DOMContentLoad之前使用它,诶,就是这么麻烦~

上途中上方是network时间线,下面是主线程时间线

怎么?你说影响defer和async影响到html解析了?没有啊,他们那是占了normal的光~

下载完之后,就各自为营,按部就班的执行啦。

看到没,就算defer写到async的上面,也不一定就在async前面执行,defer肯定得在DOMContentLoad之前执行,而async的话,啥时候完事啥时候执行。也就是说,只有defer不会影响html解析,所以啊,如果你们要想加快页面显示的话,就视情况多用defer吧。还有,这俩属性只有script在head中才会生效嗷。

  • 放到head标签内,啥都不加的script

  • 放到body标签内,啥都不加的script

  • 放到head标签内,加defer的script

  • 放到head标签内,加async的script

再往后就会执行页面的布局和渲染啦~

对了,再嘱咐你们一点,匿名函数我只能用统一的命名显示出来,所以你们调试的时候,估计不会很愉快。要根据情况决定是否真的有必要使用匿名函数啊~

我回来了~

所以说,我们首先可以合理加载执行script来减少html解析的阻塞,其实还有css的元素,因为css会阻塞css的执行,毕竟js有可能要操作css嘛。

还有什么回流、重绘什么的,这里就不再重复了。

有兴趣的朋友可以用某些网站查看一些performance,看看自己的掌握程度,有问题欢迎讨论。

猜测,类似词法解析和语法解析,词法解析先获取到要下载的内容,或者绑定在document上的事件,所以之后出发DOMContentLoad的时候会触发之前绑定的事件,而且没有在主线程中显示

总结

本文简单的说了两个点,一是network的timing栏,二是performance panel,只要掌握了这两个功能的使用方法,就可以快速定位网站性能问题,进而进行优化,早点下班美滋滋~

常见优化方案

  • 开启压缩
  • 图片使用webp
  • cdn
  • 提取关键帧资源,优先加载
  • 代码分片,延迟加载
  • 预加载,preload prefetch等
  • script defer async
  • 域名分片,减少请求数
  • 服务端渲染
  • 如果已经升级为https,可以考虑使用http2.0。两个点:一个头信息压缩,二是解决了队头阻塞问题,三是增加了服务端push。
  • 资源预取,混合应用可以加离线宝
  • 在mvvm类框架进行前端渲染,我们可以使用defer加在我们的内容,在配上骨架图,保证用户看到的不是空白的页面。
  • 当然少不了我们的业务代码,好的代码会让网站更稳定的运行下去
  • 分析network的timing,然后通过本文最开始提及的各字段分析问题

如果你看过一些语言和框架,你会发现大同小异



不过,这些个优化只是在我们看来,还是不够完善的,我们需要知道真实的用户环境下是怎么样的,需要RUM(Real User Monitoring: 真实用户数据监测),写个脚本来收集用户的访问情况,并可视化,作为我们的性能指标再好不过了。

这里推荐采用三组数据:

  • 平均值: 平均速度
  • 中位值: 中间速度
  • 第95百分位值: 弱势网络、浏览器等数据,更全面

可以使用performanceResource Timing API来进行数据收集

想做更多的优化,还是应该了解一下chromium源码,锦上添花。

如果不想看源码,那就让浏览器来告诉我们,它做了什么吧~

最后,在网站优化方面,前端能做的不是很多,真正的大头是在op和服务端,所以说,转行吧~ ??

timing-explanation

timing

script 的 defer 和 async 官方解释

页面生命周期

原文地址:https://www.cnblogs.com/xiaoyuxy/p/12607835.html

时间: 2024-08-24 20:15:00

快速定位网站性能问题,提前下班!的相关文章

Lua Profiler——快速定位Lua性能问题

导读 随着Lua在项目中的大量使用,它所带来的性能问题也逐步成为了项目运行时的重大性能瓶颈之一.特别是内存相关的性能问题,无论是内存分配过大还是内存泄露无法回收,目前都已经在不少研发项目中集中爆发. UWA推出的GOT Online中的Lua模式已经慢慢成为研发团队对Lua进行日常性能监控的有效手段.因此,也有越来越多的团队反馈,在监控到table数持续上涨,引用Mono对象持续增多等等问题时,应该如何快速地解决? 本次博物纳新推荐的开源库项目:LuaProfiler-For-Unity,相信可

网站性能优化你需知道的东西

本文提到的网站性能指网站的响应速度,这也符合绝大部分人对于网站性能的理解:访问快速的网站性能好,反之,访问速度越慢,则网站性能越差.本文总结的优化方法是宏观的工程层面的方法,并不包含微观的语言语法层面的方法,例如,JS.CSS的语法优化,这一部分同样影响网站的性能,但语言语法层面的优化更多的是取决于开发人员的编程水平. 什么样的网站响应速度快呢?其实很容易想到,网站加载资源的速度越快,网站响应速度越快:网站需要加载的资源越少,网站响应速度越快.这就分别对应网站性能优化的两大方向:资源缓存.资源合

快速定位隐蔽的sql性能问题及调优【转载】

在前几天,有个开发同事问我一个问题,其实也算是技术救援,他说在有个job数据处理的频率比较高,在测试环境中很难定位出在哪有问题,而且速度也还能接 受,但是在生产环境中总是会慢一些,希望我能在测试环境中协助他们,看看是不是sql语句出什么问题了还是其它相关的问题. 这种类似实时监控的语句,从第一印象来说,很可能通过awr捕获不到,如果通过ash来捕获,因为测试环境中有几十套测试环境在运行,就算得到某个时间点 的一些sql语句,直接在报告中映射到语句对应的schema信息还是有一些困难的.因为测试时

如何利用快照( snapshot )功能快速定位性能问题

我们常常会遇到这样的困惑,收到用户或者客服的反馈,平台使用有问题,但是测试人员搭建环境后又没办法复现故障,最后导致问题没法解决,眼睁睁地看着用户流失. 这是因为线上生产环境非常复杂.很多时候是偶发性 bug ,但却很难捕捉.特别是随着微服务盛行,系统复杂度增加,线上故障的快速定位和及时分析解决面临着巨大挑战,以前只能靠人来解决.但是人的问题解决能力与速度依赖于经验,有时候甚至需要跨部门的配合,这样的成本非常高,一旦关键人员流失.部门配合不融洽,整个故障的解决速度就会极速下降. 这时候我要给大家带

Linux性能优化从入门到实战:06 CPU篇:快速定位CPU瓶颈

CPU性能指标 ?? ??(1)CPU使用率:1) 用户态CPU使用率(包括用户态 user 和低优先级用户态 nice).2) 系统CPU使用率.3) 等待 I/O 的CPU使用率.4) 软中断和硬中断的CPU使用率.5) 虚拟机占用的CPU使用率. ??(2)平均负载 Load Average:过去 1 分钟.过去 5 分钟和过去 15 分钟的平均负载 ??(3)进程上下文切换:1) 无法获取资源而导致的自愿上下文切换:2) 被系统强制调度导致的非自愿上下文切换. ??(4)CPU缓存命中率

90%的人会遇到性能问题,如何用1行代码快速定位?

简介:如何在众多异常性能指标中,找出最核心的那一个,进而定位性能瓶颈点,最后进行性能调优.整篇文章会按照代码.CPU.内存.网络.磁盘等方向进行组织,针对对某一各优化点,会有系统的「套路」总结,便于思路的迁移实践. 1. 代码相关 遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误.性能优化的最佳位置,是应用内部. 譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层.框架层的一些性能问题,大多数都能从日

Yahoo!网站性能最佳体验的34条黄金守则

Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是旨在提高网站性能. Excetional Performance团队总结出了一系列可以提高网站速度的方法.可以分为7大类34条.包括内容.服务器.cookie.CSS.Javascrīpt.图片.移动应用等七部分. 其中内容部分一共十条建议: 一.内容部分 尽量减少HTTP请求 减少DNS查找 避免

Yahoo! 35条网站性能优化建议

Yahoo! 35条网站性能优化建议 分类: 网站性能优化2014-03-08 17:18 212人阅读 评论(0) 收藏 举报 网站性能优化 Yahoo!的 Exceptional Performance团队为改善 Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是旨在提高网站性能.原版猛戳:Best Practices for Speeding Up Your Web Site, Excetional Perfo

6个原则、50条秘技提高HTML5应用及网站性能

Jatinder Mann是微软Internet Explorer产品的一名项目经理,在BUILD 2012大会上,他做了题为“提高HTML5应用和网站性能的50条秘技(50 performance tricks to make your HTML5 apps and sites faster)”的演讲,介绍了很多为Web应用程序提速的技巧. Mann的建议是按照下面六个原则组织的. 1. 快速响应网络请求. 避免重定向.排名前1000的网站中,63%使用了重定向.如果不执行重定向的话,页面速度