我的hashmap实现的性能改进

时间:2017-03-16 03:09:26

标签: performance go hash hashmap bit-manipulation

我决定尝试制作自己的散列图(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
}

对于如此少的操作,它比标准库慢的主要原因是什么?

1 个答案:

答案 0 :(得分:0)

将两个数组合并为一个结构数组可以减少缓存未命中数,并且是最大的性能提升。

也会在没有碰撞改善性能的情况下提前返回。