GO語言————6.12 通過記憶體快取來提升效能
6.12 通過記憶體快取來提升效能
當在進行大量的計算時,提升效能最直接有效的一種方式就是避免重複計算。通過在記憶體中快取和重複利用相同計算的結果,稱之為記憶體快取。最明顯的例子就是生成斐波那契數列的程式(詳見第 6.6 和 6.11 節):
要計算數列中第 n 個數字,需要先得到之前兩個數的值,但很明顯絕大多數情況下前兩個數的值都是已經計算過的。即每個更後面的數都是基於之前計算結果的重複計算,正如示例 6.11 fibonnaci.go 所展示的那樣。
而我們要做就是將第 n 個數的值存在陣列中索引為 n 的位置(詳見第 7 章),然後在陣列中查詢是否已經計算過,如果沒有找到,則再進行計算。
程式 Listing 6.17 - fibonacci_memoization.go 就是依照這個原則實現的,下面是計算到第 40 位數字的效能對比:
- 普通寫法:4.730270 秒
- 記憶體快取:0.001000 秒
記憶體快取的優勢顯而易見,而且您還可以將它應用到其它型別的計算中,例如使用 map(詳見第 7 章)而不是陣列或切片(Listing 6.21 - fibonacci_memoization.go):
package main
import (
"fmt"
"time"
)
const LIM = 41
var fibs [LIM]uint64
func main() {
var result uint64 = 0
start := time.Now()
for i := 0; i < LIM; i++ {
result = fibonacci(i)
fmt.Printf("fibonacci(%d) is: %d\n", i, result)
}
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)
}
func fibonacci(n int) (res uint64) {
// memoization: check if fibonacci(n) is already known in array:
if fibs[n] != 0 {
res = fibs[n]
return
}
if n <= 1 {
res = 1
} else {
res = fibonacci(n-1) + fibonacci(n-2)
}
fibs[n] = res
return
}
記憶體快取的技術在使用計算成本相對昂貴的函式時非常有用(不僅限於例子中的遞迴),譬如大量進行相同引數的運算。這種技術還可以應用於純函式中,即相同輸入必定獲得相同輸出的函式。
相關文章
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取
- Go語言記憶體模型Go記憶體模型
- go語言高效能快取元件ccache分析Go快取元件
- 高效能記憶體快取 ristretto記憶體快取
- 圖解Go語言記憶體分配圖解Go記憶體
- [譯]Go語言記憶體佈局Go記憶體
- Go 語言的手工記憶體管理Go記憶體
- 函數語言程式設計-記憶化快取函數程式設計快取
- CPU快取記憶體快取記憶體
- Go 語言手寫本地 LRU 快取Go快取
- 通過減少記憶體使用改善.NET效能記憶體
- 使用Go實現健壯的記憶體型快取Go記憶體快取
- Glide - 記憶體快取與磁碟快取IDE記憶體快取
- DDD 和 記憶體快取記憶體快取
- 記憶體快取選型記憶體快取
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- 【譯】快取 React 中事件監聽來提升效能快取React事件
- Android記憶體優化之記憶體快取Android記憶體優化快取
- docker部署redis快取記憶體DockerRedis快取記憶體
- 談談CPU快取記憶體快取記憶體
- CPU快取和記憶體屏障快取記憶體
- django 快取表格到記憶體Django快取記憶體
- CQengine高效能記憶體資料快取查詢框架記憶體快取框架
- 如何用GO語言編寫快取服務?Go快取
- C語言-記憶體分配C語言記憶體
- C語言:記憶體使用C語言記憶體
- Go 語言社群新提案 arena,可優化記憶體分配Go優化記憶體
- C語言-記憶體管理之一[記憶體分配]C語言記憶體
- C語言-記憶體管理之二[記憶體指令]C語言記憶體
- Go 語言效能分析Go
- 調整緩衝區快取記憶體(Buffer Cache)的效能(轉)快取記憶體
- 使用快取記憶體Serde加速Kafka反序列化效能 - Kaszuba快取記憶體Kafka
- 調整緩衝區快取記憶體(Buffer Cache)的效能(1)快取記憶體
- 調整緩衝區快取記憶體(Buffer Cache)的效能(2)快取記憶體
- 調整緩衝區快取記憶體(Buffer Cache)的效能(3)快取記憶體
- MRAM快取記憶體的組成快取記憶體
- Google的Go語言速度提升Go