6.5.2 提升循环运算性能
这是我在csdn上的第一篇学习笔记~
数据处理循环的三种方法
以没有优化的代码举例
//循环一
for (var i=0;i<items.length;i++)
{
process(items[i]);
}
//循环二
var j=0;
while (j<items.length)
{
process(items[j++]);
}
//循环三
var k=0;
do{
process(items[k++]);
}while (k<items.length);
每个循环体中都都发生了如下操作:
(1)在控制条件中读一次属性(items.length)
(2)在控制条件中执行一次比较(i<items.length)。
(3)比较操作,观察条件控制体的运算结果是不是true(i<items.length==true)。
(4)一次自加操作(i++)。
(5)一次数组查找(items[i])。
(6)一次函数调用(process(items[i]))。
在这些简单循环中,这几步操作是每次迭代都必须进行的。因此如果可以减少每次迭代中操作的总数就可以大幅度提高循环的整体性能。
优化方法一
优化循环的第一步是减少对象成员和数组项查找的次数。在大多数浏览器上,这些操作比访问局部变量或直接量需要更长时间。例如,在上面代码中,每次循环都查找 items length,这是一种浪费,因为该值在循环体执行过程中不会改变,因此产生了不必要的性能损失。
可以简单地将此值存入一个局部变量中,在控制条件中使用这个局部变量,从而提高了循环性能:
//循环一
for (var i=0;len=items.length;i<len;i++)
{
process(items[i]);
}
//循环二
var j=0,count=items.length;
while (j<count)
{
process(items[j++]);
}
//循环三
var k=0;num=items.length;
do{
process(items[k++]);
}while (k<num);
优化后的循环只在数组长度进行一次属性查询,使控制条件只有局部变量参与运算,所以速度更快,根据数据长度,在大多数浏览器上总循环时间可以节省大约25%,在IE浏览器中可节省50%。
优化方法二
通过改变循环的顺序提高循环性能。——倒序循环
//循环一
for (var i=items.length;i--)
{
process(items[i]);
}
//循环二
var j=items.length;
while (j--)
{
process(items[j]);
}
//循环三
var k=items.length-1;
do{
process(items[k]);
}while (k--);
每个控制条件只是简单的与0比较,控制条件与true值比较,任何非零数字自动强制转换为true,0等同于false。
此时的控制条件已经由两次比较减少到一次比较了,这样的操作大幅度提高了循环速度。
此时的步骤为
(1)在控制条件中读一次属性(items.length)
(2)在控制条件中进行一次比较(i==true)。
(3)比较操作,观察条件控制体的运算结果是不是true。
(4)一次减法操作(i–)。
(5)一次数组查询(items[i])。
(6)一次函数调用(process(items[i]))。
新循环中每次迭代减少两个操作,提升了运算速度。