优化循环变量
我们的一种典型循环:
for (var i=0;i<items.length;i++){
doSomething(items[i])
}
但是每次循环都要查找items.length,造成性能上的浪费。将items.length存入局部变量len,优化如下:
for (var i=0,len=items.length;i<len;i++){
doSomething(items[i])
}
使用倒序循环
for (var i=items.length;i--) {
doSomething(i)
这里控制条件会被强制转换为true/false,与true进行比较。
实际上是将每次循环条件判断从两次比较(迭代小于总数吗?它等于true吗?)减少到一次比较(它等于ture吗?)。
虽然你需要做一些额外的脑力工作来思考如何倒序完成你的任务。
减少循环次数
达夫设备,Duff’s Device,来自c的技巧。
var iterations = Math.floor(items.length/8),
startAt = items.length % 8,
i = 0;
do{
switch(startAt){
case0:doSomething(items[i++]);
case7:doSomething(items[i++]);
case6:doSomething(items[i++]);
case5:doSomething(items[i++]);
case4:doSomething(items[i++]);
case3:doSomething(items[i++]);
case2:doSomething(items[i++]);
case1:doSomething(items[i++]);
}
startAt = 0;
}while(--iterations);
循环不一定是8的整数倍,startAt用于存放余数,第一次循环中执行余数次的doSomething()
但是在少于1000次的循环只有微不足道的性能提升。更多的时候在考虑使用吧。
for,while,do-while性能相似,谁也不比谁快。
这是一篇看《高性能JavaScrpit》时的随手记录。