golang 效能優化之 bitset 代替 hashset
hashset 是一種非常高效的資料結構,插入和查詢的複雜度都是 O(1),基本上能滿足大部分場景的效能需求,但在一些特殊的場景下,頻次非常高的呼叫依然會成為效能瓶頸(用 pprof 分析),比如廣告裡面的定向邏輯,在一次請求中過濾邏輯可能會執行上千次,而其中有些過濾剛好都是一些列舉值,比如性別定向,年齡定向等等,對於這種可以用列舉表示的值可以用 bitset 優化,能有20多倍的效能提升
bitset 的本質也是一種 hashset,只不過雜湊桶用一個 uint64 來表示了,uint64 中的每一位用來代表一個元素是否存在,如果為1表示存在,為0表示不存在,而插入和查詢操作就變成了位運算
bitset 實現
bitset 的實現比較容易,下面這個是一個只支援列舉值不超過64的版本,當然也可以擴充到任意長度,使用一個 uint64 陣列作為 hash 桶即可
type BitSet struct {
bit uint64
}
func (bs *BitSet) Add(i uint64) {
bs.bit |= 1 << i
}
func (bs *BitSet) Del(i uint64) {
bs.bit &= ^(1 << i)
}
func (bs BitSet) Has(i uint64) bool {
return bs.bit&(1<<i) != 0
}
效能測試
func BenchmarkSetContains(b *testing.B) {
bitset := NewBitSet()
hashset := map[uint64]struct{}{}
for _, i := range []uint64{1, 2, 4, 10} {
bitset.Add(i)
hashset[i] = struct{}{}
}
b.Run("bitset", func(b *testing.B) {
for i := 0; i < b.N; i++ {
for i := uint64(0); i < uint64(10); i++ {
_ = bitset.Has(i)
}
}
})
b.Run("hashset", func(b *testing.B) {
for i := 0; i < b.N; i++ {
for i := uint64(0); i < uint64(10); i++ {
_, _ = hashset[i]
}
}
})
}
BenchmarkSetContains/bitset-8 500000000 3.81 ns/op 0 B/op 0 allocs/op
BenchmarkSetContains/hashset-8 20000000 89.4 ns/op 0 B/op 0 allocs/op
可以看到 bitset 相比 hashset 有20多倍的效能提升
參考連結
轉載請註明出處 本文連結:http://www.hatlonely.com/2018/04/12/golang-效能優化之-bitset-代替-set/
相關文章
- golang 效能優化之累加雜湊Golang優化
- Golang效能分析與優化Golang優化
- Golang net/http 效能優化GolangHTTP優化
- 六、Android效能優化之UI卡頓分析之渲染效能優化Android優化UI
- Android效能優化之佈局優化Android優化
- 前端效能優化之Lazyload前端優化
- Android 效能優化之記憶體優化Android優化記憶體
- Android效能優化篇之服務優化Android優化
- Android 效能優化(十二)之我為什麼寫效能優化Android優化
- Oracle優化案例-union代替or(九)Oracle優化
- SQL優化案例-union代替or(九)SQL優化
- Linux 效能優化之 cup 篇Linux優化
- Linux 效能優化之 IO 篇Linux優化
- React效能優化方案之PureComponentReact優化
- JS效能優化 之 FOR迴圈JS優化
- 效能優化之拋棄Calendar優化
- React效能優化方案之PureRenderMixinReact優化
- 4、React元件之效能優化React元件優化
- KubeCon 2021|使用 eBPF 代替 iptables 優化服務網格資料面效能eBPF優化
- 【前端效能優化】vue效能優化前端優化Vue
- Flutter效能優化實踐之TimelineFlutter優化
- Vue首頁效能優化之gzipVue優化
- MySQL效能優化之索引設計MySql優化索引
- 效能優化之達夢AWR使用優化
- Web效能優化之瘦身祕笈Web優化
- 前端效能優化之防抖-debounce前端優化
- 前端效能優化之節流-throttle前端優化
- 面試題:webpack之效能優化面試題Web優化
- iOS效能優化 - 工具Instruments之CoreAnimationiOS優化
- JS效能優化 之 文件片段 createDocumentFragmentJS優化Fragment
- 效能優化之關於畫素管道及優化(二)優化
- iOS效能優化系列篇之“列表流暢度優化”iOS優化
- iOS效能優化系列篇之“優化總體原則”iOS優化
- Golang優化-優雅退出Golang優化
- Oracle優化案例-又見union代替or(二十)Oracle優化
- 《MySQL 效能優化》之 InnoDB 儲存引擎MySql優化儲存引擎
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- Linux 效能優化之 CPU 篇 ----- 套路篇Linux優化