分类: 系统运维
2010-03-25 21:37:14
JavaScript的性能问题
摘自《Ajax+Lucence构建搜索引擎》
javascript是一种解释型语言,性能无法达到和C、C++等编译语言的水平,但还是有一些方法来改进。
1、循环
JavaScript中的循环方式有for(;;)、while()、for(in)3种。其中for(in)的效率极差,因为for(in)执行过程中需要查询散列键。for(;;)和while()比较,while循环的效率要优于for(;;)。
2、局部变量和全局变量
局部变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的堆栈当中的。
3、不使用eval
使用eval函数相当于在运行时再次调用解释引擎对内容进行解释运行。
4、减少对象查找
因为JavaScript的特性,对于类是表达式a.b.c.d.e,需要至少4次查询操作。首先检查a在检查a中的b,如此往下。应尽量避免出现这样的表达式、可以利用局部变量把要访问的最终结果放入一个临时的位置进行查询。
这一点可以和循环结合起来,例如对一个数组可以先取他的长度 var len = a.length,其实java 中对于列表的循环也是先取size给一个临时变量。
5、字符串连接
如果是追加字符串,最好使用s+=anotherStr操作,而不要使用s=s+""
但是如果要连接多个字符串,应该少用 += 例如:
s+=a;
s+=b;
s+=c;
应该写成 s+=a+b+c;
如果是收集字符串,比如收集字符串,最好使用一个缓存实现。具体的实现思路就是使用Javascript数组来收集每个字符串,最好使用join方法将这些字符串连接起来,如下面代码所示:
var buf = new Array();
for(var i=0;i<100;i++){
buf.push(i.toString());
}
var all = buf.join("");
6、类型转换
类型转换是JavaScript编程中容易出错的地方,因为JavaScript是动态类型语言,即弱类型语言,不能指定变量的具体类型。
(1)把数字转换成字符串,应用""+1,虽然比较别扭一点、但效率是最高的
(""+)>String()>.toString()>new String()
String()属于内部函数,所以速度很快,toString()要查询原型中的函数,new String()用于返回一个精确的副本。
(2)浮点数转换成整型 parseInt()用于将字符串转换成数字,应该使用Math.floor()或者Math.round()来实现浮点型和整型之间的转换。
(3) 对于自定义的对象,如果定义了toString()方法进行类型转换的话,推荐显示调用toString()。
7、使用直接量
以往我们都使用new Array(parm,parm1..)等形式,对于直接量的解释JavaScript支持使用[param,param1....]来直接表达一个数组。
前一种方式调用Array内部构造器,而后一种方式是解释引擎直接解释的,故执行速度要略微快一点。同理var foo = {}比 var foo = new Object()快,var reg=/..../比 var reg=new RegExp()执行的快些。
8、字符串遍历
优先使用正则表达式。
9、高级对象
自定义高级对象和Date、RegExp等对象构造时会消耗大量的时间和资源。
10、插入HTML
document.write效率较低,innerHTML效率较高。
11、下标查询
使用直接的下标查找一个对象的属性比通过.name方法要快很多。
12、创建DOM节点
通常我们可能会使用字符串直接写HTML语句来创建节点,实际上这样有如下缺点:
无法保证代码的有效性;
字符串操作效率低。
应该使用documeng.createElement()方法。如果存在现成的样板节点,应该使用cloneNode()方法。