4.算法优化 -高性能JavaScript

既然是总结,就不要重复书中内容了,适当总结、扩展、思考。

  实际上会用在javascript上面的算法实在是不会太多,但由于js非编译语言的特性,所以

浏览器解释器能给的优化不能算太好。优化仅有的一些循环和流程控制显得非常必要。

  然后我一上来就中枪了,以为for in这样的写法会比较好写,所以一直做数组操作的时候

使用这个方法。但是,这个方法会同时搜索实例或原型属性,所以每次迭代的时候都会产生额外

的开销。因些,不要用for in来遍历数组。

  递归如果次数太多,就不要使用了,会抛出异常。改用迭代。

  如果不是均匀分布的话,可以使用二分法,找出数据出现次数多的一部分做数据判断切割。

  书中提到了三个算法-

1.Duff's Device:处理大数据循环

var i = items.legnth%8;
while(i){
  process(items[i]--);    
}

i = Math.floor(items.elgnth/8);

while(i){
    process(items[i]--); 
    process(items[i]--); 
    process(items[i]--); 
    process(items[i]--); 
    process(items[i]--); 
    process(items[i]--); 
    process(items[i]--); 
}

但是这里我产生了两个疑问,希望各位看客帮我解答一下。

1.为什么是八次。把一个循环用8拆分。

2.为什么这么做就可以减少很多时间问题?

实际上我感觉这个问题就像是把 for(i=0;i<100;i++)变成了

for(i=0;i<10;i++){

  for(j=0;j<10;j++)
}

一样。那它改变的内容实质在哪里呢????

 

2.有映射关系的优化:

var arr = [r0,r1,r2,r3,r4,r5,r6,r7];
return arr[i];

会比 
if(i==0){
    return r0;
}
else if(i==1){
    return r1;
}

快.

但是。!!!!
既然有映射关系,
那还不如直接
return r(映射值)*i(选择值);

请各位看客帮我解答一下。

 

3.缓存技术算法: 

function memoize(fundamental,cache){
  cache = cache||{};
  var shell = function(arg){
        if(!cache.hasOwnProperty(arg)){
            cache[arg] = fundamental(arg);
    }
    return cache[arg];
  };
}


调用方法:
var memfactorial = memoize(factorial,{"0":1,"1":1});
var fact6 = memfactorial(6);
var fact5 = memfactorial(5);
var fact4 = memfactorial(4);

实际上这个算法就是将以后可能会用到的计算过的值保存下来,用空间換取时间。
posted @ 2013-01-11 19:38  Bug罗  阅读(504)  评论(0编辑  收藏  举报