hashset 대신 golang 성능 최적화 bitset
bitset 의 본질 도 hashset 입 니 다. 다만 해시 통 은 uint 64 로 표 시 했 습 니 다. uint 64 의 모든 사람 은 하나의 요소 가 존재 하 는 지 여 부 를 나타 내 는 데 사 용 됩 니 다. 1 에 존재 하 는 지, 0 에 존재 하지 않 는 지, 삽입 과 조회 작업 은 비트 연산 이 됩 니 다.
bitset 구현
bitset 의 실현 이 비교적 쉽 습 니 다. 다음은 매 거 진 값 만 64 를 초과 하지 않 는 버 전 입 니 다. 물론 임의의 길이 로 확장 할 수 있 습 니 다. uint 64 배열 을 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< 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 배 이상 성능 이 향상 되 었 음 을 볼 수 있 습 니 다.
참조 링크
코드 주소:https://github.com/hatlonely/easygolang/blob/master/datastruct/bitset.go
전재 출처 본문 링크 를 밝 혀 주 십시오.http://www.hatlonely.com/2018/04/12/golang-성능 최적화 비트 셋 - 대체 - set /
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.