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

优化原则

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

减少开销

通常认为开销就是程序的执行时间。而在进行优化工作时,应该把重点放在对程序开销影响最大的那部分。
假设我们有四个模块: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. linux杂记(六)档案权限

    [KANO@kelvin ~]$ ls -al 总用量 drwx------. KANO KANO 10月 : . drwxr-xr-x. root root 9月 : .. drwxrwxr-x. ...

  2. PHP弱类型:WordPress Cookie伪造

    1 PHP弱类型 PHP是弱类型语言,所以变量会因为使用场景的不同自动进行类型转换.PHP中用 == 以及 != 进行相等判断时,会自动进行类型转换,用 === 以及 !== 进行判断时不会自动转换类 ...

  3. 对discuz的代码分析学习(三)mysql驱动

    一. 属性分析         1.tablepre :表名称前缀        2.version : 数据库版本        3.drivertype:驱动类型        4.querynu ...

  4. MySQL float 与decimal 各中的区别。

    想一个问题: 1/3+1/3+1/3=1.0 0.3+0.3+0.3 =0.9 想一想在小数的世界里要什么表示1/3呢!它的办法就是取一个与1/3十分接近的小数来代替:如上面例子中的0.3来代替1/3 ...

  5. rails总结

    rails总结 注意:本文档以rails3.2版本为基础,并且用RubyMine 4.0.3作为ide 一.rails的结构与重要文件 Rails 是一个MVC库.同时,Rails的特点就是:惯用名优 ...

  6. tpopela/vips_java

    tpopela/vips_java Implementation of Vision Based Page Segmentation algorithm in Java

  7. 用NDKr9编译最新ffmpeg2.0.1到android平台

    原文来自http://www.mingjianhua.com 本文参照 http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ 在linux下的 ...

  8. 三分钟教你学Git(十六) - 统计

    有时候想统计仓库的情况,比方代码量.贡献者之类的. 1 统计某人的commit数量 git log --author="$(git config --get user.name)" ...

  9. Forstner算子

  10. 通过浏览器直接打开Android应用程序

    需求 通过手机浏览器直接打开Android应用程序.假设本地已经安装了指定Android应用,就直接打开它:假设没有安装,则直接下载该应用的安装文件(也能够跳转到下载页面). 实现效果 假设手机上已经 ...