今天在做一个树形结构计算时使用了递归,使用js计算,树一旦比较大了,页面经常卡顿,后来调试发现问题出在递归函数上,后来给每个叶节点加了计算缓存才算解决了问题。
为了弄明白究竟慢在哪里,自己做了个实验,以简单的斐波那契数列为例,先定义一个简单函数
f=function(n){
return n<2?n:f(n-1)+f(n-2);
}
再定义一个时间计算函数
time=function(func){
function dofunc(n){
var t1=new Date();
var r=func(n);
var t2=new Date();
console.log((t2-t1)+'ms');
return r;
}
return dofunc
}
好了现在看看运行时间
命令 ftime=time(f) | 结果 | 时间 |
---|---|---|
ftime(30) | 832040 | 1369ms |
ftime(31) | 1346269 | 2199ms |
ftime(32) | 2178309 | 3533ms |
ftime(33) | 3524578 | 5884ms |
再往上去,我这电脑已经扛不住了,居然只能算到30左右。。。
如果加个缓存试试呢
重新定义一个带缓存的ff函数
ff=function(){
mem=[0,1];
function f(n){
var r=mem[n];
if(typeof(r)!='undefined'){
return r;
}else{
mem[n]=f(n-2)+f(n-1)
return mem[n];
}
}
return f
}()
再来看看运行时间
命令 ftime=time(ff) | 结果 | 时间 |
---|---|---|
fftime(30) | 832040 | 0ms |
fftime(300) | 2.2223224462942035e+62 | 1ms |
fftime(1000) | 4.346655768693743e+208 | 1ms |
fftime(3000) | Infinity | 2ms |
太出乎我的意料了,也难怪那些大公司都对算法是有要求的...
PS:后来想用快一点的语言会不会好些,于是用python测试了一下性能,发现也就是比js快个3、4倍的样子,不过遇到这样指数级的问题,光靠语言间的快慢是无法解决的,C/C++大拿不要嘲笑,我确实不会。。。
网友评论