我决定尝试制作自己的散列图(here)
对于读取它比标准库实现慢28%,我想知道是否可以加速以下代码,索引()这对于查找至关重要:
const numOnes = uint8(20)
const ones = uint32(1 << numOnes - 1)
func (m *Map) Index(num uint64) uint32 {
part := uint32(num) & ones
remaining := num >> numOnes
start := m.starts[part]
bitsNum := m.bitNums[part]
matchedBits := bitsNum & uint16(remaining)
offset := BitScoreCache[bitsNum][matchedBits]
return start + uint32(offset)
}
注意BitScoreCache是var BitScoreCache [5000][5000]uint16
,它应该是只读的,并在多个不同的地图实例之间共享。
示例用法:
func (pa PrimeAdvancedAnagrammar) GetAnagrams(word string) []string {
return pa.m[pa.locator.Index(PrimeProduct(word))] //pa.m is an [][]string
}
与标准库:
func (pba PrimeBasicAnagrammar) GetAnagrams(word string) []string {
return pba.m[PrimeProduct(word)] //pba.m is a map[uint64][]string
}
对于如此少的操作,它比标准库慢的主要原因是什么?
答案 0 :(得分:0)
将两个数组合并为一个结构数组可以减少缓存未命中数,并且是最大的性能提升。
也会在没有碰撞改善性能的情况下提前返回。