zoukankan      html  css  js  c++  java
  • 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

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

    章节小结:

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

  • 相关阅读:
    jvm2-垃圾回收
    Elasticsearch脑裂问题详细分析以及解决方案
    ThreadLocal原理(基于jdk1.8)
    seata-分布式事务-学习笔记
    Java中的数组
    HAProxy 详细配置说明
    (基础)--- 约数
    (基础)--- Trie树
    Oracle 数据类型对比 不同数据类型对数据空间占用及查询效率影响
    python F score打分
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15248498.html
Copyright © 2011-2022 走看看