Web性能优化分析

如果你的网站在1000ms内加载完成,那么会有平均一个用户停留下来。2014年,平均网页的大小是1.9MB。看下图了解更多统计信息。

直击现场 

《HTML开发MacOSApp教程》  http://pan.baidu.com/s/1jG1Q58M

网站的核心内容需要在1000ms内呈现出来。如果失败了,用户将永远不会再访问你的网站。通过降低页面加载的时间,很多著名公司的收入和下载量有显著的提升。比如

  • Walmart 每降低100ms的加载时间, 他们的收入就提高1%.
  • Yahoo 每降低400ms的加载时间,他们的访问量就提升9%。
  • Mozilla 将他们的页面速度提升了2.2秒,每年多获得了1.6亿firefox的下载量。

网站优化的步骤

  1. 设定性能预算。
  2. 测试当前的性能。
  3. 找出导致性能问题的地方。
  4. 最后,duang,使用优化特技。

下面有几种方法可以提升你的页面性能,让我们来看看

速度指标

速度指标是指页面的可视部分被呈现在浏览器中的平均速度。表示为毫秒的形式,并且取决于viewport的大小。请看下图(用视频帧的形式展现页面加载时间,以秒为单位)。

速度指标越低越好。

速度指标可以通过Webpagetest 来测试(由Google维护)

长话短说

Webpage test 有很多特性,比如在不同的地方用不同的浏览器跑多个测试。 还可以测算其他的数据比如加载时间,dom元素的数量,首字节时间等等…

例如:查看amazon在webpagetest上的测试结果 。

可以看看这个视频,了解由 Patrick Meenan 讲解的关于webpagetest的更多信息(需要FQ)。

渲染阻塞

如果你知道浏览器如何运行,那么你应该知道HTML, CSS, JS是怎么被浏览器解析的以及其中哪个阻塞了页面的渲染。如果你不知道,请看下图。

点击how a browser works了解更多浏览器工作原理(作者为Tali Garsiel 和Paul Irish).

浏览器渲染的步骤

  1. 首先浏览器解析HTML标记去构造DOM树(DOM = Document Object Model 文档对象模型)
  2. 然后解析CSS去构造CSSOM树( CSSOM = CSS Object Model CSS对象模型)
  3. 在将DOM和CSSOM树结合成渲染树之前,JS文件被解析和执行。

现在你知道浏览器如何进行解析了,让我们看看是哪一部分阻塞了渲染树的生成。

1. 阻塞渲染的CSS

有人认为CSS阻塞了渲染。在构造CSSOM时,所有的CSS都会被下载,无论它们是否在当前页面中被使用。

为了解决这个渲染阻塞,跟着下面的两个步骤做

  1. 将关键CSS内嵌入页面中,即将最重要的(首次加载时可见的部分页面所使用到的)style写入head中的 <style></style>里。
  2. 移除没用到的CSS。

那么我是如何找出没用到的CSS的呢。

  1. 使用Pagespeed Insight 去得到像未使用的CSS,阻塞渲染的CSS和JS文件等等的统计数据。例如:Flipkart的Pagespeed Insight统计结果。
  2. 使用Gulp任务,如gulp-uncss或是使用Grunt 任务,如grunt-uncss。如果你不知道他们是什么,请阅读我之前的文章。

##专业小贴士

  1. 使用CSS Stats保证页面中完全没有未被用到的元素,唯一的样式和字体等等。
  2. Pagespeed Insight Chrome 插件.
  3. Tag Counter Chrome 插件.

2. 渲染阻塞的JavaScript

如果在解析HTML标记时,浏览器遇到了JavaScript,解析会停止。只有在该脚本执行完毕后,HTML渲染才会继续进行。所以这阻塞了页面的渲染。

为了解决它

在<script></script>标签中使用 async或defer特性。

  1. <script async>将会在HTML解析时下载该文件并在下载完成后马上执行。
  2. <script defer> 将会在HTML解析式下载该文件并在HTML解析完成后执行。

例如: async and defer都在Google Analytics中使用

点击查看async 和defer的浏览器支持。

内存泄漏

内存泄漏和页面臃肿 是前端开发者所要面对的问题之一。让我们来看看如何发现并解决内存泄漏。

在JavaScript中寻找内存泄漏

使用Chrome Task Manager(任务管理器)去检测app所使用的内存以及js内存(总体内存+实时内存)。如果你的内存一直随着你的每次操作而提高,那么你可以怀疑有内存泄漏了。

下面是Chrome Task Manager的截图。

Chrome DevTools分析

使用 Heap Profiler 去查看内存泄漏。打开Chrome devTools 然后点击profiles 标签,接着选中 take heap snapshot。如果你不了解Chrome DevTools,请阅读之前的文章.

Heap Profiler有四个快照视图(snapshot view)

  1. Summary 视图 – 展示对象的总体数量以及它们的实例总数,浅部(Shallow)大小(对象本身的内存大小)以及保留(Retained)大小(自动GC发生后所释放的内存大小+无法执行到的对象的内存大小)。
  2. Comparison 视图- 用于比较一个操作的前后的两个或多个快照,可以检测内存泄漏。
  3. Containment 视图- 展示了你的app对象架构的整体视图 + DOMWindow 对象(全局对象下的), GC 根部, 本地对象 (来自浏览器)。
  4. Dominators 视图- 展示了 dominators 树的堆图。

点击了解更多 Heap profiler。

DOM泄漏

对DOM元素的引用会导致DOM泄漏并且阻碍自动垃圾回收(GC)的进行。

来看一个例子

1
2
3
4
5
<div>
    <div id="container">
        <h1 id="heading">I am just a heading nothing much</h1>
    </div>
</div>
1
2
3
4
5
6
7
8
var parentEle = document.getElementById('container'); //get parent ele reference 得到父元素的引用
 
var headingEle = document.getElementById('heading'); //get child ele reference 得到子元素的引用
 
parentEle.remove(); //removes parent element from DOM 从DOM中移除父元素
 
//but its child ref still exist, So parentEle won't collect GC'd and causes DOM Leak
//但是它的子元素引用仍然存在,所以parentEle不会被GC回收,因此导致了DOM泄漏。

将它的引用设置为null即可修复DOM泄漏。

1
headingEle = null; //Now parentEle will be GC'd

上面就是前端开发者常遇到的问题。今天就讲到这。如果你喜欢我的文章,请分享或者在下面评论。谢谢!!

转载于:https://www.cnblogs.com/RTdo/p/4437471.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闭包/Block当成函数参数实现回调

2019独角兽企业重金招聘Python工程师标准>>> Swift // MARK:// MARK: 获取数据/// 获取数据class func toolLoadData(completion:(finish: String) -> ()? ,content: String) {self .nextStepRequest({ (finish) -> ()? in// 接收到数据 调用 block 传递数据…

使用labview读取一副位图,并进行BCG校准(或修改其BCG)程序解析

进行图像处理第一步肯定就是要读取一副图片&#xff0c;然后再进行图像的BCG校准。 首先讲解一下用到的函数第一个函数为IMAQ Create&#xff0c;位于 视觉与运动--Vision Utilities---Image Management---IMAQ create 函数如图&#xff0c;对于如何看函数功能&#xff0c;还是…

实现生成小学四则运算练习题

实现小学四则运算练习题 1.题目要求 本次作业要求两个人合作完成&#xff0c;驾驶员和导航员角色自定&#xff0c;鼓励大家在工作期间角色随时互换&#xff0c;这里会布置两个题目&#xff0c;请各组成员根据自己的爱好任选一题。 题目1&#xff1a; 我们在刚开始上课的时候介绍…

[转] 64位windows下添加postgreSQL odbc数据源

系统环境&#xff1a;windows7 64位 postgreSQL9.0&#xff08;64bit)ps&#xff1a;安装postgreSQL时确定安装了odbc驱动。问题&#xff1a;点击“开始-》控制面板-》管理工具-》数据源&#xff08;ODBC&#xff09;-》用户DSN-》添加”&#xff0c;未出现postgreSQL关联选项。…

Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

1 试用了MysqlWorkBench的数据迁移功能 以为能实现&#xff1a;建立跟Sqlserver一样的表结构和视图的功能&#xff0c;sqlserver的数据迁移到mysql 实际上发现&#xff1a;即使勾选了表和视图&#xff0c;实际上却只能建立表结构。 视图结构&#xff0c;表数据&#xff0c;都没…

vscode 默认初始化_Visual Studio Code(vscode)使用介绍

[TOC]vscode 安装软件直接在vscode官网&#xff08;https://code.visualstudio.com/&#xff09;下载安装。建议将下图红框中勾选&#xff0c;安装完成后可通过鼠标右键打开vscode。安装界面使用介绍插件安装安装完成后&#xff0c;左侧栏可以看到不同模块&#xff0c;一开始包…

梯度下降法分析

梯度下降法存在的问题 梯度下降法的基本思想是函数沿着其梯度方向增加最快&#xff0c;反之&#xff0c;沿着其梯度反方向减小最快。在前面的线性回归和逻辑回归中&#xff0c;都采用了梯度下降法来求解。梯度下降的迭代公式为&#xff1a; \(\begin{aligned} \theta_j\theta_j…

PHP程序员的技术成长规划

2019独角兽企业重金招聘Python工程师标准>>> 按照了解的很多PHP/LNMP程序员的发展轨迹&#xff0c;结合个人经验体会&#xff0c;抽象出很多程序员对未来的迷漫&#xff0c;特别对技术学习的盲目和慌乱&#xff0c;简单梳理了这个每个阶段PHP程序员的技术要求&#…

flink 入门

http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me/blog/2016/05/09/flink-internals-understanding-execution-resources/ 要了解一个系统&#xff0c;一般都是从架构开始。我们关心的问题是&#xff1a;系统部署成功后…

mybatis 多租户saas_彻底理解微商城多租户Saas架构设计

原文链接&#xff1a;https://blog.csdn.net/haponchang/article/details/104246317&#xff0c;感谢作者提供这么好的总结&#xff01;1.具体的SaaS架构必须1.先仔细选择最适合应用程序需求的租户模型&#xff0c;2.需要根据租户模型来选定最终的架构&#xff0c;即应用程序设…

Python模块——subprocess

subprocess模块 通过Python去执行一条系统命令或脚本。 三种执行命令的方法 subprocess.run(*popenargs, inputNone, timeoutNone, checkFalse, **kwargs) #官方推荐 subprocess.call(*popenargs, timeoutNone, **kwargs) #跟上面实现的内容差不多&#xff0c;另一种写法 sub…

异步传参

2019独角兽企业重金招聘Python工程师标准>>> AJAX样板 $.ajax ({ type:"post", url:"要传递参数的地址", data:{id:id}, success:function(val) { …

PHP实现单击“添加”按钮增加一行表单项,并将所有内容插入到数据库中

PHP实现单击“添加”按钮增加一行表单项&#xff0c;并将所有内容插入到数据库中 效果图: htmljquery: <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script language"javascript&qu…

Leetcode按Tag刷题

按照Leetcode的Tag来刷题&#xff0c;从easy到hard刷题 关于如何让Leetcode按难易程度排序&#xff0c;可按以下步骤&#xff1a; 1. 进入Leetcode后&#xff0c;点击code 2.点击code后&#xff0c;可查看所有题目&#xff0c;可看到右下角有Tag标志&#xff0c;选择想要刷的T…

JMeter学习(三十一)Access Log Sampler

前提&#xff1a; 在tomcat\conf\server.xml默认情况下&#xff0c;会有一段代码&#xff1a; <Valve className"org.apache.catalina.valves.AccessLogValve" directory"logs" pattern"%h %l %u %t &quot;%r&quot; %s %b" prefix&qu…

布谷鸟沙盒分析静态文件_“案例沙盒方法”喜提国际商学院协会(AACSB)2019年启发式创新奖...

国际商学院协会(AACSB)于2019年4月14日至16日在英国爱丁堡召开年会&#xff0c;会上公布了2019年Innovation that Inspire的(启发式创新奖)获奖学校及项目。大会共收到800余个项目报名&#xff0c;最终21个项目获此殊荣。新南威尔士大学商学院以创新品牌UNSW Sandbox Method (案…

还有前景吗_喷码机行业还有前景吗 2021喷码机市场份额有多大

喷码机按照其实现的方式不同又分为&#xff0c;压电喷墨技术、压阀式喷墨技术、和热发泡喷墨技术(Thermal Inkjet Technolog)&#xff0c;简称TIJ。根据以上原理可以将喷码机分为&#xff1a;小字符喷码机&#xff0c;大字符喷码机&#xff0c;高清晰喷码机。喷码机是运用带电的…

supervisor 守护多个进程_进程管理工具之Supervisor

相关介绍Supervisor是用Python 开发的一个client/server服务&#xff0c;是 Linux /Unix系统下的一个进程管理工具&#xff0c;不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程&#xff0c;当一个进程意外被杀死&#xff0c;s…

yaahp层次分析法步骤_综合评价方法之层次分析法,选择再也难不倒你!

在日常生活中&#xff0c;我们常常面临着各种各样的选择。比如你想去北京、上海、广州旅游&#xff0c;但是由于种种原因&#xff0c;你只能选择一个地点去旅游&#xff0c;那么哪一种选择是最优的呢&#xff1f;有没有较为科学的方法帮助我们更好地选择呢&#xff1f;今天&…

TCP/IP TELNET SSH

快速导航 远程登录示例 关于远程登录&#xff1f; 嵌入&#xff1f; 用来控制远程服务器上运行的应用程序字符&#xff1f; 转义&#xff1f; 操作方式&#xff1f; 关于SSH&#xff1f; 远程登录示例 关于远程登录&#xff1f; 网络虚拟终端(Network Virtual Terminal,NVT)通过…