《高性能网站建设进阶指南》

优化原则

优化的目的是希望降低程序的整体开销。

减少开销

通常认为开销就是程序的执行时间。而在进行优化工作时,应该把重点放在对程序开销影响最大的那部分。
假设我们有四个模块:A,B,C,D,其中模块A运行所需开销54%,模块B运行所需开销4%,模块C运行开销30%,模块D运行开销12%。
即使可以通过某种方法将模块B性能开销减少到2%,其实也只是降低了整体开销的2%。如果A的开销减少10%,却可以获得更好的效果,而显然模块A更值得去优化。优化那些开销不大的模块回报太低。

优化循环

程序大部分的时间都消耗在循环上,优化那些只执行一次的代码得到的回报微不足道。但优化循环得到的好处却总是让人欣慰。

合理利用Ajax

利用Ajax技术,客户端将较小的数据包发送到服务端,然后服务端响应请求返回另一个较小的数据包,客户端的JavaScript程序处理服务端返回的数据包,更新浏览器中的页面。这样数据的传输量和反馈时间间隔都大大减少,同时客户端和服务端工作量也减少。万万不可将所有的应用数据都发送给浏览器,这样反而会增加服务端的响应时间,而返回给客户端的数据也增加程序运行的压力,从而降低性能。

注意DOM

浏览器不是为应用平台而设计的,所以在处理Ajax应用程序的时候具有挑战。但是浏览器的发展速度很快,远远超出想象,已经有足够的能力去处理和执行复杂的应用。通过Ajax库可以碾碎很多障碍。
但是浏览器对DOM的解析依然低效。浏览器运行时,最大的开销往往是解析DOM而不是JavaScript 。注意优化DOM结构,避免多余的开销大的DOM操作。


伪多线程

就像所有的GUI应用程序一样,浏览器按队列顺序完成其队列中单独事件的处理。它按照先进先出的顺序从队列中取出,然后决定如何处理。但是,在浏览器中这个过程是单线程的,浏览器每次只能处理这些任务中的一个,并且其他任意一个任务都可以阻止其他任务的执行。由于JavaScript现在不支持多线程,所以无法创建一个后台程序执行开销很大的代码。而实际上,我们有一些方法可以在JavaScript中实现多线程的工作,但是却没有线程之间相互入侵的危险。

定时器

待完善

Web Workers

使用 setTimeout()、setInterval()、XMLHttpRequest 和事件处理程序等技术模拟“并行”,确实都是异步运行的。但没有阻碍未必就意味着并行。系统会在生成当前执行脚本后处理异步事件。可以通过Web Worker执行一些操作,同时却不会阻碍UI和其他脚本。

内存管理

JavaScript中绝大部分的运行环境(?为什么是绝大部分?)都实现了垃圾回收。但是自动管理内存是有开销的。在执行回收时,它们会冻结整个运行环境,包括正在调用的主线程,直到遍历完整整个创建对象的“堆”。在这个过程中查找不再使用或者能够回收内存的对象。
对于大部分应用程序而言,GC是完全透明的。冻结运行环境的时间短到完全可以忽略。但是随着内存占用的增加,遍历整个内存中保存着对象的“堆”查找不再使用的对象的时间将增长,最终引起注意。
当这种情况发生是,应用程序开始定期出现间歇迟钝,更严重一点整个浏览器可能出现反映迟钝。
在编写代码时要注意:

  • 使用delete关键词从内存中移除不再需要的对象;

  • 从网页DOM树中移除不再需要的节点

通过拆分节省下载

将JavaScript分成两部分:一部分是渲染初始页面必须的,剩下的作为另一部分。在初始化时只加载必要的 JavaScript,其余的JavaScript稍后再加载。
拆分JavaScript代码的一个难点就是要避免出现未定义标识符错误。如果在执行的时候引用到了一个被延时加载的标识符时,就会出现这种问题。不过也有解决方法:
在延迟加载的代码和UI界面相关联的情况下,可以通过提示来巧妙的避开与用户的冲突。比如菜单中可以添加一个“加载中”的图标,告诉用户正在加载。或者干脆在延迟加载的代码里绑定事件处理程序,这样一来代码还未加载执行时,点击不会执行任何JavaScript代码。将两者结合更佳。

延时加载的代码不与页面元素相关联的情况下,可以使用模拟函数(stub function)来解决这个问题。模拟函数是一个与原函数名称相同但是函数体为空,或者包含一些临时代码的函数。当调用它们时,动态加载其他的JavaScript代码。当增的JavaScript代码下载完成之后,模拟函数便被新的函数覆盖。JavaScript函数没有重载。

高性能网站优化-创建快速响应的Web的更多相关文章

  1. 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》

    这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录.   一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ...

  2. Java Web 高性能开发,第 3 部分: 网站优化实战

    这个系列的前两篇,介绍了前端的优化技术,这些技术秉承了前人至高无上的智慧,我只是负责吸收和传播.然而,这些技术一般也都是某某大型网站的技术经验,我们大部分人或许只能接触到相对小规模的网站,小规模的网站 ...

  3. Yslow 之 高性能网站建设指南(High.Performance.Web.Sites)

    一个朋友做了2年前端重构,不知道 YSLOW.我推荐给他的时候,他惊呼这工具很强大. YSLOW 只是 Yahoo 前端发布的一个评测网站前端质量的插件.它的原理是基于 Yahoo 前端工程师提出来的 ...

  4. web网站优化

    没事儿研究一下YAHOO工程师对网站优化给出的策略,对重点部分在这儿做下笔记 -----------------------------------------------我是分割线--------- ...

  5. 高性能网站服务器的架设优化-Nginx优化

    一:对于高性能网站 ,请求量大,如何支撑?思路 在网站架构设计中,大家一定对 LNMP (Linux Nginx Mysql Php) 不陌生.LNMP 确实是一个非常优秀的架构,秉承着自由,开放,高 ...

  6. 为移动Web应用创建快速响应按钮

    英文原文出自 Google Deveploers<Creating Fast Buttons for Mobile Web Applications>,由XiaoYi_HD翻译,并首发于 ...

  7. C#Web网站的创建

    一.CS与BS的区别 CS软件:需要在客户端安装软件. BS软件:只需要浏览器就能运行,Web网站就是BS软件. 创建过程: 1.文件新建---新建网站----空白网站 2.右击网站项目---添加网页 ...

  8. 高性能网站架构设计之缓存篇(5)- Redis 集群(上)

    集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节 ...

  9. (转)高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

随机推荐

  1. NETTY 编码器介绍

    1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decod ...

  2. python基础学习笔记5--对象方法、属性和迭代器

    对象方法.属性和迭代器 1.构造方法 1)构造方法和一般方法的不同点:当一个对象被创建后,会立即调用构造方法. 2)在Python中创建一个构造方法很容易,只要把init方法的名字从简单的init修改 ...

  3. MySQL my.cnf 参数说明

    MySQL 5.5.13 参数说明: [client] character-set-server = utf8 port    = 3306 socket  = /data/mysql/3306/my ...

  4. What do `?i` and `?-i` in regex mean?

    http://stackoverflow.com/questions/15145659/what-do-i-and-i-in-regex-mean

  5. PHP并发最佳实践

    直接参考大牛的: http://www.searchtb.com/2012/06/rolling-curl-best-practices.html

  6. ssh的学习

    快毕业了.临走前帮导师搭建了gerrit,git服务器,其中涉及ssh的知识,就总结了下.希望对大家有帮助 一.前言(ssh出世的原因) 万物有因就有果,既然ssh存在,就必然有它存在的理由! 许多网 ...

  7. UIKit封装的系统动画

    简介 在UIKit中,对UIView封装了很多类方法来进行简单的动画实现,在动画过程中,通过对属性值的修改来完成一系列的效果. 在IOS4以前,主要通过 + beginAnimation + setA ...

  8. uva 10404 Bachet's Game(完全背包)

    题目连接:10404 - Bachet's Game 题目大意:由一堆石子, 给出石子的总数, 接下来由stan和ollie两个人玩游戏,给出n, 在给出n种取石子的方法(即为每次可取走石子的数量), ...

  9. 本地yum源安装GCC

    Linux环境下yum源安装GCC 前提条件是有Linux环境的安装盘ISO文件 在Linux系统中创建两个目录,一个是用来存放ISO文件,一个是用来挂载该ISO文件,如下: $mkdir /root ...

  10. JS学习之prototype属性

    javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用.以A.prototype = new B();为例, 理 ...