Go语言通过内存缓存来提升性能
发布时间:2020-12-16 09:36:51 所属栏目:大数据 来源:网络整理
导读:前面我们介绍了递归函数,递归函数的缺点就是比较消耗内存,而且效率比较低,那么我们要怎样提高程序的执行效率呢? 当在进行大量计算的时候,提升性能最直接有效的一种方式是避免重复计算,通过在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称
前面我们介绍了递归函数,递归函数的缺点就是比较消耗内存,而且效率比较低,那么我们要怎样提高程序的执行效率呢? 当在进行大量计算的时候,提升性能最直接有效的一种方式是避免重复计算,通过在内存中缓存并重复利用缓存从而避免重复执行相同计算的方式称为内存缓存。 下面我们以经典的递归求斐波那契数列为例,来对比一下普通实现方法和加入内存缓存后程序的执行情况。 普通的实现方法普通方法的实现思路是,要计算数列中第 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 位: %dn",i,result) ??? } ??? end := time.Now() ??? delta := end.Sub(start) ??? fmt.Printf("程序的执行时间为: %sn",delta) } func fibonacci(n int) (res int) { ??? if n <= 2 { ??????? res = 1 ??? } else { ??????? res = fibonacci(n-1) + fibonacci(n-2) ??? } ??? return }运行结果如下所示:
数列第 1 位: 1 内存缓存的实现方法内存缓存的实现思路是在计算得到第 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 位: %dn",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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |