golang 效能最佳化之 bitset 代替 hashset

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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/opBenchmarkSetContains/hashset-8            20000000            89.4 ns/op           0 B/op           0 allocs/op

可以看到 bitset 相比 hashset 有20多倍的效能提升

參考連結

  • 代碼地址:https://github.com/hatlonely/...
轉載請註明出處
本文連結:http://www.hatlonely.com/2018...
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.