JS中缓存的简单使用

创建于

想必开发人员都知道斐波那契数列,并且也都会用相应的程序语言编写斐波那契数列。斐波那契数列也成黄金分割数列,在在很多领域都有直接的应用。那么在JavaScript中,斐波那契数列的写法也是很简单。

1
2
3
4
5
6
7
8
var count = 0;//测试执行次数
function fibonacci(n){
count++;
if( n <= 2 ){
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
}

乍一看,上面的代码好像也没什么问题,对应的数也能算出来了,但是,上面的代码在运行的过程中存在着大量的重复的运算,那么这样的代码写出来性能很差。具体可以定义一个变量count来查看代码的执行次数。

1
2
3
4
5
fibonacci(10); // count = 109
fibonacci(15); // count = 1219
fibonacci(20); // count = 13529
fibonacci(25); // count = 150049
fibonacci(30); // count = 1664079

通过以上的结果会发现,越往后面的数列程序运行的次数越来越多。其实通过仔细分析,每次计算时都是递归到满足最终的判断条件,那么在这个过程中,有很多数都是重复的进行运算,那么我们完全可以将这些重复数据存储起来,在需要的时候将其调用即可。在这里可以使用缓存来解决这个问题。

具体缓存相关的概念就不多说了,这里只是简单的应用下缓存。我们可以创建一个缓存(这里采用一个数组),在每次代码执行时,都去缓存中找相应的数,如果有的话就直接返回回来,这样就省去了后面的计算,如果没有,就将算出来的值放到缓存中,以便下次使用。具体的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var arr = [];//缓存
var count = 0;//测试执行次数
function fibonacci(n){
count++;
if(arr[n] !== undefined){
return arr[n];
}
if(n <= 2){
arr[n] = 1;
return 1;
}
var temp = fibonacci(n-1) + fibonacci(n-2);
arr[n] = temp;
return temp;
}

接下来接着测试一下代码的执行次数。

1
2
3
4
5
fibonacci(10); // count = 17
fibonacci(15); // count = 27
fibonacci(20); // count = 37
fibonacci(25); // count = 47
fibonacci(30); // count = 57

到这里了是不是有点惊喜了,两次数据进行对比,是不是发现执行次数减少了很多很多,有木有。这只是一个缓存的简单使用,便可以很大的提升代码的性能,这就是JS的迷人之处。记得之前听过这样一句话:一个工作了3年的Java程序员可能和一个工作了5年的Java程序员写出来的代码可能区别不大,但是一个工作了3年的JS程序员和一个工作了5年的JS程序员写出来的代码区别可能就很大。好多次想起来,确实是这样,感觉每次写出来的JS代码的每一句都可以再次的进行精减。现在这些非常火的开源框架,不正是结合许多人的智慧经过巧妙的精简所创作出来供大家使用吗!!!

当然,上面的代码也可以优化,比如可以将其封装起来,而缓存用数组的话就显得太局限,具体的做法可以参考jQuery中缓存是如何创建的,确实很经典、很巧妙。

目录都去哪了...