概念:
在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称为内存缓存
package main import ( "fmt" "time" ) /* 实现一个斐波那契数列,使用递归的方法 */ func fib(n int) (res int) { if n <= 2 { res = 1 }else { res = fib(n-1) + fib(n-2) } return //结束方法 /* 比较消耗内存,而且效率比较低 */ } func main() { result := 0 start := time.Now() for i := 1; i <= 40; i++ { result = fib(i) fmt.Printf("数列第 %d 位: %d\n", i, result) } end := time.Now() delta := end.Sub(start) fmt.Printf("程序的执行时间为: %s\n", delta) }
该方法最终程序的执行时间为:881.0582ms
实现思路:
在计算得到第 n 个数的同时,将它的值保存到数组中索引为 n 的位置上
在后续的计算中先在数组中查找所需要的值是否计算过
如果找到了,则直接从数组中获取
如果没找到,则再进行计算
package main import ( "fmt" "time" ) /* 先预声明一块内存区域,大小比fib数列传入的形参要大 */ const LIM = 41 var fibs [LIM]uint64 //提前声明的一块内存区域 /* 实现fib数列,每次运算之前查询一下内存区域的 */ func fibonacci2(n int) (res uint64) { //记忆化:检查数组中是否已知斐波那契(n) //查询内存缓存 if fibs[n] != 0 { /*fibs赋值给res,下次计算的时候使用res进行计算*/ res = fibs[n] return } if n <= 2 { res = 1 }else { res = fibonacci2(n-1) + fibonacci2(n-2) } fibs[n] = res /* 每一次都从已赋值的内容开始计算,避免了重复计算 */ return } func main() { var result uint64 = 0 start := time.Now() for i := 1; i < LIM; i++ { result = fibonacci2(i) fmt.Printf("数列第 %d 位: %d\n", i, result) } end := time.Now() delta := end.Sub(start) fmt.Printf("程序的执行时间为: %s\n", delta) }
程序的执行时间为: 3.1022ms
可以看到性能提升的几百倍
章节小结:
利用预声明的数组存储结果值。在每一次计算完成时都将结果先保存到预先声明的数组中。避免的重复的计算