9.9Go语言内存缓存

2021/9/10 7:05:08

本文主要是介绍9.9Go语言内存缓存,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

9.9Go语言内存缓存

什么是内存缓存

概念:

在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称为内存缓存

普通方法实现斐波那契数列不加内存缓存计算时间

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

可以看到性能提升的几百倍

章节小结:

  • 利用预声明的数组存储结果值。在每一次计算完成时都将结果先保存到预先声明的数组中。避免的重复的计算



这篇关于9.9Go语言内存缓存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程