刚刚看到有人支持我写的博客,表示还是比较感动的,发现热心的用户在我的博客留言说“一个系统每天有200万在线用户,问我怎么设计性能场景?”,其实这个问题呢就属于业务没理清,这个问题就像我问你,一个城市一天有一百万人出行,请帮我找出交通压力哪里最大?这个问题一问你便知道无从下手了。

  好了,我们接着来学习今天的内容,之前说了后端协议的知识,今天来说说前端的分析,在讲述前端分析之前,大家可以先去看一本书《高性能网址建设指南》,虽然书是十年前的,但是思想还是可以的,我在这先给大家列一下书里面的主要思想。

  《高性能网址建设指南》书中有个关于前端优化的黄金原则:只有10%~20%最终用户响应时间花在了下载HTML文档上,其余80%~90%时间花在了下载页面的所有组件上。并提出了14个对应的规则,接下来我简单提一下这14个规则,详细的可以去找书看下。

  • 规则1---减少HTTP请求(1.多个图片可以转换成图片地图;2.css sprintes 合并图片;3.使用data:url模式内联图片;4.合并脚本和样式表)
  • 规则2---使用内容分发网络CDN
  • 规则3---添加Expires头(完整缓存)
  • 规则4---压缩组件(gzip压缩方式,图片和PDF不应该压缩,其余可以压缩)
  • 规则5---将样式表放在顶部(避免无样式内容闪烁->使用link标签将其放在head头部)
  • 规则6---将脚本放在底部(放在顶部会阻塞下载,产生白屏现象)
  • 规则7---避免CSS表达式(用事件处理器来为特定的事件提供所期望的动态行为)
  • 规则8---使用外部的JS和CSS(内联无法缓存,外置的可以缓存,而且组件可以重用,同时降低了耦合度)
  • 规则9---减少DNS查找(通过Keep-alive和较少的域名)
  • 规则10---精简Javascript和css(从代码移除不必要的字符(注释、换行、空格等),css可以合并相同类,移除不使用的类)
  • 规则11---避免重定向(重定向时的第一个HTTP请求会阻塞后面html文档的加载)
  • 规则12---移除重复脚本(不必要的HTTP请求和执行javascript所浪费的时间)
  • 规则13---配置ETag(服务器检测缓存组件和原始服务器组件匹配的方式)
  • 规则14---使Ajax可缓存(确保Ajax请求遵守性能指导,尤其应具有长久的Expires头)

 上面说了那么多,我想要不举个实例给大家看看吧,既然现在腾讯这么有钱,我们就去看看腾讯的网站吧,我们用谷歌去访问下www.qq.com看一下qq官网的性能如何。

我们从这个点可以看得出来,访问qq首页有215个请求,大小为3.1M,总共耗时15.44秒,当然可能有个别不重要的请求拖慢了速度,我们可以看到大部分请求完成是在6秒左右,但是这也说明了qq的网站可能还是存在一些前端性能问题的,我们来具体看几个请求,从上往下来看:

第一个请求如下:从第一个请求来看,总共花了158.76ms,虽然不是很大但是这个是个什么请求我们不太清楚,因为我没看到具体返回,有可能是将用户信息发送给服务端吧。

我先说下耗时的组成和具体含义:

  • Stalled:这个是TCP连接检测过程(如果过长可能是丢包导致,有可能是网络或者服务端的问题)
  • Request sent:发送时间(取决于上行带宽和服务器带宽)
  • Waiting:等待时间(服务器处理时间)
  • Content Download:接收时间(取决于下行带宽和服务器带宽)

接着我们看第二个主要的请求:可以看到这个请求的返回是标准的html和内嵌了css和js,并未进行压缩,而且也是混写的,所以其实这个返回是可以进行优化的。

接着我们可以去看,基本上一半的请求都是下载图片,我想这么图片的请求是不是又可以再进行优化呢(一个页面200多个请求个人感觉是很多的,因为每一个请求就是一次交互过程,如果一台服务器总的hps(hit per second)是固定的,请求数越少是不是就意味着能支持的并发数就会越多呢?尤其是对腾讯大公司而言,假设首页减少10个请求,100w的用户的访问,那么就可以减少总共1000w的请求呢,那么这个是不是就意味着可以减少上百台甚至更多的服务器了呢?所以我感觉qq的性能估计是服务器累出来的,但这个能省的钱是不是还能再省一点呢?比如请一个好一点的性能专家呢?哈哈哈,开个玩笑哈!)?我相信qq的首页前端还是有一定的优化空间的(当前访问qq慢也有个人网速不是太好的原因,不要太计较哈,嘻嘻)。

好了,我们接着来学习吧,在性能测试的时候,我想最重要的应该还是“分析思路”,猜测(根据监控和经验(所以说要很广的知识面))->测试->验证->确认,这四个过程不断循环,这就是性能的分析思路。

这里提一点,大部分性能问题来源于数据库喔!

一直说性能需要很广的知识面,这个是必然的,别人写一个东西,如果你不清楚别人怎么写的而且知道怎么写才更好,又怎么能帮助别人调优呢?所以具备开发、监控、网络、数据库、配置等能力都是必不可少的,当然还得有编写报告和一定的逻辑思维能力喔!

  今天的最后我们来说一下性能调优的一些思路:

  • 化点播为广播:相当于服务器主动push资源给客户端,而不用每个客户端主动去请求(电台广播和1对1的电话交流的区别)
  • 化同步为异步:异步就相当于用户请求后先记录过一段时间再给服务器然后返回,减轻服务器压力(就像我们发微信朋友圈,有可能发了一段时间后系统会提示我们发送失败,所以是一个异步过程,当然这个发朋友圈也是一个广播的过程)
  • 化实时计算为预算:点播后异步静态化广播(像我们评论,这个点播计算后通过异步然后静态化给中间件服务器再广播给客户端)
  • 层层降级:像秒杀这类操作,整个过程就是1.前端先挡一部分(过滤99%的请求);2.后台web端服务器挡一部分(再次过滤99%的请求);3.然后在代码中对一个数据类型进行存放,获取能存入的记录;4.对这个数据类型一次性写数据库

前三天的课程我们已经将性能的整体思路给大家理了下,接下来的几天我会跟大家讲解下性能的又一大难点--->性能监控,可能需要有一定的linux基础,可以提前学习下喔!

性能测试day03_前端分析调优思路的更多相关文章

  1. web前端性能调优(二)

    项目经过第一波优化之后APP端已基本已经符合我们的要求了,但是TV端还是反应比较慢,页面加载和渲染都比较慢了一点,我觉的还是有必要在进行一些优化,经过前面的优化,我们的优化空间已经小了一部分,不过还是 ...

  2. MindSpore模型精度调优实战:常用的定位精度调试调优思路

    摘要:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,我们为MindSpore量身定做了可视化调试调优组件:MindInsight. 本文分享自华为云社区<技 ...

  3. jvm调优思路及调优案例

    jvm调优思路及调优案例 ​ 我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代(Eden)里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时 ...

  4. mysql性能瓶颈分析、性能指标、指标搜集方法与性能分析调优工具

    本文主要讲解mysql的性能瓶颈分析.性能指标.性能指标信息的搜集工具与方法.分析调优工具的使用. 文章尚未完成. 性能瓶颈: 慢.写速度比读速度慢很多  主要的性能指标: 访问频度, 并发连接量, ...

  5. MySQL性能调优思路

    1.MySQL性能调优思路 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理? 是周期性的变化还是偶尔问题?是服务器整体性能的问题, 还是某单条语句的问题? 具体到单条语句, ...

  6. 技能篇:linux服务性能问题排查及jvm调优思路

    只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...

  7. web前端性能调优

    最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...

  8. Linux服务器性能查看分析调优

    一 linux服务器性能查看 1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc ...

  9. 性能测试系列-java gc调优

    性能测试中除了需要做好性能测试外,我们还需要做性能测试后的,性能调优,需要发现性能问题,也需要做性能调优,在做性能调优中,jvm的性能调优是经常遇到的一个. 随着jdk版本的迅速变化,jdk里面的GC ...

随机推荐

  1. Vertical-align + 表单

    Vertical-align 垂直对齐方式 定义行内元素的基线相对于该元素所在的基线的垂直对齐. inline inline-clock img图片标签具有,块级元素没有. vertical-alig ...

  2. leetcode python 006

    ##  改为z型字符串def change_to_z(s,n):    ## 字符串不能生成完整的区,用空格补全    b=len(s)%(2*n-2)    if b!=0:        s+=' ...

  3. angualr Material Icons

    首先需要项目引入 angualr meterial icons的资源库 图标资源链接 https://klarsys.github.io/angular-material-icons/ <md- ...

  4. tomcat中web项目编译后的结构

    一. jsp文件在WEB-INF中 原项目结构及编译后的项目结构,原web项目与编译文件的对应关系如下:java下面的.java文件----->WEB-INF下的classes中,target下 ...

  5. 云硬盘性能测试工具FIO介绍

    一.云硬盘的性能衡量指标 云硬盘的性能指标一般通过以下几个指标进行衡量 IOPS:每秒的读写次数,单位为次(计数).存储设备的底层驱动类型决定了不同的IOPS 总IOPS:每秒执行的I/O操作总次数 ...

  6. mysql varchar存储最大

    utf-8的汉字 3个字节,varchar()括号中的数字是可存储的最大字符数,但是总和不超过65535个字节,这是行的size限制的,除以3差不多21800多,算上其他列等信息,如果用最大的话设置2 ...

  7. 2/18 (pycharm 快捷键、循环、join语句)

    Alt + Enter 快速修正 Ctrl + / 行注释/取消行注释 Ctrl + Shift +  /  块注释 Ctrl + Alt + I    自动缩进 CTRL + D  复制选定的区域或 ...

  8. nodejs -- require , exports , module

    1. require , exports . -------------------------- 文件: 1) index.js //两种方式都可以: var forExports = requir ...

  9. Java学习笔记34(sql基础 :增删改查1)

    create database qy97;/*创建数据库*/ use qy97; /*使用数据库 use 数据库名*/ show tables; /*查看所有的表*/ select database( ...

  10. Linux 应用——常用函数(usual function)

    main函数: 新建testmain.c #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> ...