网站优化总结
网站优化方案:
从减少HTTP请求数量方面考虑:
最基本,最重要的一条:能放入单个TCP/IP包中的字节数是1160。
一、图片文件优化方案:
- 对于大量公用的小图片,采用合并方式(将小图片合并成一个大图片)。
- 利用CSS的background-position 属性进行设置
示例:<div style="width:16px;height:16px;background-image: url(../img/iknow/icons.gif);background-position:0 -32px;"></div>
每个小图片的长宽分别是16px,所以显示第一个图片坐标就是0 0,第二个图片的坐标是:0 -16px,第三个图片的坐标是0 -32px,以此类推……
二、js文件优化方案
- 首先将所有js文件进行压缩优化。
- 查询所有页面引用的js文件信息。将其记录到一个txt文件中。
- 将所有页面上引用的js文件信息分类。
- 合并分类的js文件。
- 替换引用HTML文件中引用js地址信息。
三、css文件优化方案:
- 首先将项目中的所有css进行压缩优化。
- 查询页面中引用css文件信息。
- 将引用信息分类。
- 合并分类的css文件。
- 替换页面中引用css的相应地址。
四、jsp页面的优化
- 去除jsp页面中无用的空行、tab符、空格符。
从程序执行上考虑:
一、Html和Css执行效率:
- 标记有始有终.
- 删除无用的空格、tab、空行。
- 如果要处理绝对位置的元素,diaplay和visibility具有同样的效果,使用visibility会更快。
- 把 CSS 放到代码页上端.和用户访问期望有关。CSS 放到最顶部,浏览器能够有针对性的对 HTML 页面从顶到下进行解析和渲染。
- 避免 CSS 表达式.
- 从页面中剥离 JavaScript 与 CSS;
- 避免使用Filter.
- 使用 <link> 而不是@importChoose <link> over @import 在 IE 中 @import 指令等同于把 link 标记写在 HTML 的底部。
一、js执行效率:
优化原则:
- 尽量减少不必要的对象创建。
- 多字符串连接时用Array.join()替换 string += "XX"; ,提升速度,也即自定义一个StringBuilder()或者StringBuffer()方法,用法与java中的StringBuilder()方法相同。
- 变量名尽量使用最短的字符表示,尽量一次定义多个变量。
如:function fun(username,userage){alert(username+userage);}
应为:function fun(a1,a2){alert(a+b);}
- 替换布尔值: 如:1替换ture,0替换false
- 缩短否定检测: 如:if(name == null){} 替换为:if(!name){}
- 使用数组和对象字面量:
如:var test = new Array; 替换为:var test = [];
var test = new Object; 替换为:var test = {};
- 注意变量的作用域范围,局部变量的速度要比全局变量的访问速度更快。
- 使用for(;;),while(),for(in)三种循环时应尽量避免使用for(in)方法,
如果是循环变量递增或递减,不要单独对循环变量赋值,应该在它最后一次读取的时候使用嵌套的++或--操作符。
如果要与数组的长度作比较,应该事先把数组的length属性放入一个局部变量中,减少查询次数,尽量避免with语句。
- 不使用Eval,使用eval相当于在运行时再次调用解释引擎对内容进行运行,需要消耗大量时间。这时候使用JavaScript所支持的闭包可以实现函数模版。
- 减少对象查找,因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。这一点可以和循环结合起来,因为我们常常要根据字符串、数组的长度进行循环,而通常这个长度是不变的,比如每次查询a.length,就要额外进行一个操作,而预先把var len=a.length,则就少了一次查询。
- 类型转换
把数字转换成字符串,应用 "" + 1,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:("" + ) > String() > .toString() > new String();
浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()。Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。
对于自定义的对象,如果定义了toString()方法来进行类型转换的话,推荐显式调用toString(),因为内部的操作在尝试所有可能性之后,会尝试对象的toString()方法尝试能否转化为String,所以直接调用这个方法效率会更高。 - 使用直接量,JavaScript支持使用[param,param,param,...]来直接表达一个数组,以往我们都使用new Array(param,param,...),使用前者是引擎直接解释的,后者要调用一个Array内部构造器,所以要略微快一点点。同样,var foo = {}的方式也比var foo = new Object();快,var reg = /../;要比var reg=new RegExp()快。
- 字符串遍历操作,对字符串进行循环操作,譬如替换、查找,应使用正则表达式,因为本身JavaScript的循环速度就比较慢,而正则表达式的操作是用C写成的语言的API,性能很好。
- 高级对象,自定义高级对象和Date、RegExp对象在构造时都会消耗大量时间。如果可以复用,应采用缓存的方式。
- 定时器,如果针对的是不断运行的代码,不应该使用setTimeout,而应该是用setInterval。
- 插入HTML内容时候尽量找容器进行innerHTML操作,而尽量避免使用document.write();
- 对象查询,使用[""]查询要比.items()更快,这和前面的减少对象查找的思路是一样的,调用.items()增加了一次查询和函数的调用。
- 创建DOM节点,创建页面元素时应该是用document.createElement()方法,而如果文档中存在现成的样板节点,应该是用cloneNode()方法,因为使用createElement()方法之后,你需要设置多次元素的属性,使用cloneNode()则可以减少属性的设置次数——同样如果需要创建很多元素,应该先准备一个样板节点。
- 尽量用switch代替2个以上条件的if。
- 尽量减少else if语句数量,将条件按二叉树方式排列。用if语句和多个else语句时,可能性越大的情况越往前放。
- 优先使用内置方法.
- 节约使用DOM操作,如:若要在DOM树中添加A节点,A中又包含其他子节点,尽量先把所有子节点添加到A中后,再把A添加到DOM树中。
- 操作css样式时注意以下问题:
diaplay和visibility具有同样的效果,使用visibility会更快。
二、jsp执行效率:
优化原则:
- 选择正确的页面包含机制:在JSP中有两种方法可以用来包含另一个页面:1、使用include指示符(<%@ includee file=”test.jsp” %>)。2、使用jsp指示符(<jsp:includee page=”test.jsp” flush=”true”/>)。在实际中我发现,如果使用第一种方法的话,可以使得系统性能更高。
- 关闭服务器Servlet/JSP自动重载技术功能。
- 正确地确定javabean的生命周期:
- 在servlet的init()方法中缓存数据
- 不要滥用HttpSession,如果没有必要,就应该关闭JSP页面中对HttpSession的缺省设置执行代码:<%@ page session="false"%>,当你不需要HttpSession时,尽快地释放它:当你不再需要session时,你可以通过调用HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点。
- 将页面输出进行压缩:有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩,这种方法可以戏剧性地减少HTML文件的下载时间。因此,如果你将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持gzip压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。
- 正确地确定javabean的生命周期,缺省的生命周期为page。如果没有正确地选择bean的生命周期的话,它将影响系统的性能。如果你只想在一次请求中使用某个bean,但你却将这个bean的生命周期设置成了session,那当这次请求结束后,这个bean将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期,并在bean的使命结束后尽快地清理它们,会使用系统性能有一个提高。
三、图片优化效率:
- 重新检查图片的大小,如果图片切割的不合理,重新进行切片。