Go语言通过内存缓存来提升性能
前面我们介绍了递归函数,递归函数的缺点就是比较消耗内存,而且效率比较低,那么我们要怎样提高程序的执行效率呢?
当在进行大量计算的时候,提升性能最直接有效的一种方式是避免重复计算,通过在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称为内存缓存。
下面我们以经典的递归求斐波那契数列为例,来对比一下普通实现方法和加入内存缓存后程序的执行情况。
当在进行大量计算的时候,提升性能最直接有效的一种方式是避免重复计算,通过在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称为内存缓存。
下面我们以经典的递归求斐波那契数列为例,来对比一下普通实现方法和加入内存缓存后程序的执行情况。
普通的实现方法
普通方法的实现思路是,要计算数列中第 n 个数字,需要先得到它前面的两个数,以此类推。这么做的弊端是会产生大量的重复计算,代码如下所示:package main import ( "fmt" "time" ) func main() { result := 0 start := time.Now() for i := 1; i <= 40; i++ { result = fibonacci(i) fmt.Printf("数列第 %d 位: %d\n", i, result) } end := time.Now() delta := end.Sub(start) fmt.Printf("程序的执行时间为: %s\n", delta) } func fibonacci(n int) (res int) { if n <= 2 { res = 1 } else { res = fibonacci(n-1) + fibonacci(n-2) } return }运行结果如下所示:
数列第 1 位: 1
数列第 2 位: 1
数列第 3 位: 2
数列第 4 位: 3
...
数列第 39 位: 63245986
数列第 40 位: 102334155
程序的执行时间为: 2.2848865s
内存缓存的实现方法
内存缓存的实现思路是在计算得到第 n 个数的同时,将它的值保存到数组中索引为 n 的位置上,在后续的计算中先在数组中查找所需要的值是否计算过,如果找到了,则直接从数组中获取,如果没找到,则再进行计算,代码如下所示:package main import ( "fmt" "time" ) const LIM = 41 var fibs [LIM]uint64 func main() { var result uint64 = 0 start := time.Now() for i := 1; i < LIM; i++ { result = fibonacci(i) fmt.Printf("数列第 %d 位: %d\n", i, result) } end := time.Now() delta := end.Sub(start) fmt.Printf("程序的执行时间为: %s\n", delta) } func fibonacci(n int) (res uint64) { // 记忆化:检查数组中是否已知斐波那契(n) if fibs[n] != 0 { res = fibs[n] return } if n <= 2 { res = 1 } else { res = fibonacci(n-1) + fibonacci(n-2) } fibs[n] = res return }运行结果如下所示:
数列第 1 位: 1
数列第 2 位: 1
数列第 3 位: 2
数列第 4 位: 3
...
数列第 39 位: 63245986
数列第 40 位: 102334155
程序的执行时间为: 0.0149603s
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算