JS各种循环语句/条件语句的性能

来源:互联网 发布:winxp升级win7软件 编辑:程序博客网 时间:2024/05/17 05:56
循环语句

JS中常见的循环函数有
for
while
do while
for in
forEach

for in 一般是用在对象属性名的遍历上的,由于每次迭代操作会同时搜索实例本身的属性以及原型链上的属性,所以效率肯定低下
而forEach是基于函数的迭代(需要特别注意的是所有版本的ie都不支持,如果需要可以用JQuery等库),对每个数组项调用外部方法所带来的开销是速度慢的主要原因

小例子

for(var i = 0; i <a.length; i++; ){
     //doSomething();
}

上述代码中 
第一次
①i = 0
之后取出
②a.length
在比较
③i < a.length
然后判断
④i < a.length === true
最后
⑤i ++
之后每次循环
从②开始循环

我们现在了解到
每次循环
②取一个变量的长度重复操作没必要 而且消耗性能
所以一般都这样
var length = a.length
for(var i = 0; i <length; i++; ){
     //doSomething();
}
这样只需第一次取出长度到变量中 比较变量即可 
其实还可以更优化

③④每次循环判断也比较繁琐 可以简化 
如下代码

for(var i = a.length; i—;){
     //doSomething();
}

上述改进的代码中
①取a的长度赋值给i 
② i === true
③ i --
使用倒序循环
可以提升循环的性能
因为只要i > 0 
i === true就成立 
无需在做比较判断
简化步骤
提示性能

倒序迭代确实能略微提升代码性能
遍历数组能用普通的循环就不要用for-in和for-each

条件语句
常见的条件语句有if else 和switch case
看个例子
if (value == 0){
    return result0;
} else if (value == 1){
    return result1;
} else if (value == 2){
    return result2;
} else if (value == 3){
    return result3;
} else if (value == 4){
    return result4;
} else if (value == 5){
    return result5;
} else if (value == 6){
    return result6;
} else if (value == 7){
    return result7;
} else if (value == 8){
    return result8;
} else if (value == 9){
    return result9;
} else {
    return result10;
}

最坏的情况下(value=10)我们可能要做10次判断才能返回正确的结果,那么我们怎么优化这段代码呢?一个显而易见的优化策略是将最可能的取值提前判断,比如value最可能等于5或者10,那么将这两条判断提前。但是通常情况下我们并不知道(最可能的选择),这时我们可以采取二叉树查找策略进行性能优化。

if (value < 6){
    if (value < 3){
        if (value == 0){
            return result0;
        } else if (value == 1){
            return result1;
        } else {
            return result2;
        }
    } else {
        if (value == 3){
            return result3;
        } else if (value == 4){
            return result4;
        } else {
            return result5;
        }
    }
} else {
    if (value < 8){
        if (value == 6){
            return result6;
        } else {
            return result7;
        }
    } else {
        if (value == 8){
            return result8;
        } else if (value == 9){
            return result9;
        } else {
            return result10;
        }
    }
}

这样优化后我们最多进行4次判断即可,大大提高了代码的性能。这样的优化思想有点类似二分查找,和二分查找相似的是,只有value值是连续的数字时才能进行这样的优化。但是代码这样写的话不利于维护,如果要增加一个条件,或者多个条件,就要重写很多代码,这时switch-case语句就有了用武之地。

switch(value){
   
case 0:
        return result0;
    case 1:
        return result1;
    case 2:
        return result2;
    case 3:
        return result3;
    case 4:
        return result4;
    case 5:
        return result5;
    case 6:
        return result6;
    case 7:
        return result7;
    case 8:
        return result8;
    case 9:
        return result9;
    default:
        return result10;
}

 swtich-case语句让代码显得可读性更强,而且swtich-case语句还有一个好处是如果多个value值返回同一个结果,就不用重写return那部分的代码。一般来说,当case数达到一定数量时,swtich-case语句的效率是比if-else高的,因为switch-case采用了branch table(分支表)索引来进行优化,当然各浏览器的优化程度也不一样。


  除了if-else和swtich-case外,我们还可以采用查找表。

var results = [result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10];

//return the correct result
return results[value];

当数据量很大的时候,查找表的效率通常要比if-else语句和swtich-case语句高,查找表能用数字和字符串作为索引,而如果是字符串的情况下,最好用对象来代替数组。当然查找表的使用是有局限性的,每个case对应的结果只能是一个取值而不能是一系列的操作

  1. 当只有两个case或者case的value取值是一段连续的数字的时候,我们可以选择if-else语句
  2. 当有3~10个case数并且case的value取值非线性的时候,我们可以选择switch-case语句
  3. 当case数达到10个以上并且每次的结果只是一个取值而不是额外的JavaScript语句的时候,我们可以选择查找表 

原文http://www.cnblogs.com/zichi/p/4668420.html
0 0
原创粉丝点击