6.12 通过内存缓存提升性能

Kesa...小于 1 分钟

6.12 通过内存缓存提升性能

通过在内存中缓存和重复利用相同的计算结果,称之为内存缓存。

以 fibonacci 数列为例,计算第n个数字需要前两个数字,而前两个数字已经计算过了,将其缓存在内存中可提升速度。

06_12_fibonacci_memorization.go

const LIMIT = 50

var fibs [LIMIT]uint64

func fibF() {
	timeSpend(fib, printFibs)
	timeSpend(fibMem, printFibs)
}

func fib(n int) (res uint64) {
	if n <= 1 {
		res = 1
		return
	}
	res = fib(n-1) + fib(n-2)
	return
}

func fibMem(n int) (res uint64) {
	if fibs[n] != 0 {
		res = fibs[n]
		return
	}
	if n <= 1 {
		res = 1
	} else {
		res = fibMem(n-1) + fibMem(n-2)
	}
	// save result
	fibs[n] = res
	return
}

func printFibs(fib func(int) uint64) {
	for i := 0; i < LIMIT; i++ {
		fmt.Printf("%d ", fib(i))
	}
	fmt.Println()
}

func timeSpend(fib func(int) uint64, p func(fib func(int) uint64)) {
	start := time.Now()
	p(fib)
	end := time.Now()
	fmt.Println("Time: ", end.Sub(start))
}

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 
Time:  1m27.0570781s
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 
Time:  0s
上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2