golang 效能優化之累加雜湊
很多時候效能問題總是發生在一些不起眼的地方。最近做一個效能問題分析的時候發現,一個函式裡面使用由於字串拼接產生的臨時字串導致記憶體上漲了40%(120G 記憶體的機器),而這些臨時字串給 GC 也帶來了非常大的負擔,成為主要的效能瓶頸,而這些字串作為 map 的 key,又必須要拼接,所以想到了直接使用 hash 後的值作為 map 的 key,而這個 hash 值使用累加 hash 計算得出。
所謂累加 hash,就是對字串的 hash 可以分為任意多段,對每一段連續 hash,結果累加,對於任意一種分段方式,最後能得到一致的 hash 結果,比如:H.hash("hello world")
, H.hash("hello").hash(" ").hash("world")
, H.hash("hello wo").hash("rld)"
這些結果最後都應該是一致的,利用這個特性,就能做到對多個字串雜湊而不用拼接
BKDR hash 實現
type StringHasherBKDR uint64
// NewStringHasherBKDR 建立一個新的 Hasher
func NewStringHasherBKDR() StringHasherBKDR {
return StringHasherBKDR(0)
}
// AddStr 增加一個字串
func (bkdr StringHasherBKDR) AddStr(str string) StringHasherBKDR {
val := uint64(bkdr)
for i := 0; i < len(str); i++ {
val = val*131 + uint64(str[i])
}
return StringHasherBKDR(val)
}
// AddInt 新增一個 int 值
func (bkdr StringHasherBKDR) AddInt(i uint64) StringHasherBKDR {
val := uint64(bkdr)
val = val*131 + i
return StringHasherBKDR(val)
}
// Val 轉成 uint64 的值
func (bkdr StringHasherBKDR) Val() uint64 {
return uint64(bkdr)
}
使用上也很簡單
hasher := NewStringHasherBKDR()
So(hasher.AddStr("hello world").Val(), ShouldEqual, hasher.AddStr("hello").AddStr(" ").AddStr("world").Val())
參考連結
相關文章
- golang 效能優化之 bitset 代替 hashsetGolang優化
- 如何優化一個雜湊策略優化
- Golang net/http 效能優化GolangHTTP優化
- Golang效能分析與優化Golang優化
- redis之雜湊Redis
- 雜談WebApiClient的效能優化WebAPIclient優化
- 雜湊遊戲之雜湊盒子的趨勢未來可期遊戲
- 通過雜湊聯接進行高階優化優化
- MySQL 效能優化之索引優化MySql優化索引
- MySQL 效能優化之SQL優化MySql優化
- 效能優化之 NSDateFormatter優化ORM
- Android效能優化篇之計算效能優化Android優化
- js 雜湊雜湊值的模組JS
- 雜湊表(雜湊表)詳解
- Web效能優化之圖片優化Web優化
- 六、Android效能優化之UI卡頓分析之渲染效能優化Android優化UI
- 雜湊
- 效能優化漫談之七:效能優化的誤區優化
- 前端效能優化之效能測試前端優化
- 雜湊表(雜湊表)原理詳解
- 【尋跡#3】 雜湊與雜湊表
- Android效能優化之佈局優化Android優化
- 前端效能優化之WebP前端優化Web
- oracle效能優化之--hintsOracle優化
- 深入解析面向資料的雜湊表效能
- 資料結構之「雜湊表」資料結構
- 查詢(3)--雜湊表(雜湊查詢)
- Android效能優化篇之服務優化Android優化
- 九、Android效能優化之網路優化Android優化
- Android 效能優化之記憶體優化Android優化記憶體
- Android 效能優化(八)之網路優化Android優化
- MySQL 效能優化之快取引數優化MySql優化快取
- 樹雜湊
- 雜湊碰撞
- 字串雜湊字串
- 雜湊表
- Android 效能優化(十二)之我為什麼寫效能優化Android優化
- 面試題:webpack之效能優化面試題Web優化