我的 HashMap 实现的性能改进

标签 performance go hash hashmap bit-manipulation

我决定尝试制作自己的 HashMap (here)

对于读取,它比标准库实现慢 28%,我想知道是否可以加快以下代码的速度,Index(),这对查找至关重要:

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,它应该是只读的并且在多个不同的 map 实例之间共享。

示例用法:

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
}

它在如此少的操作方面比标准库慢的主要原因是什么?

最佳答案

将两个数组组合成一个结构数组减少了缓存未命中,是最大的性能改进。

也尽早返回没有碰撞提高性能的情况。

关于我的 HashMap 实现的性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42824589/

相关文章:

date - 时间数据的RFC3339格式无效

go - 使用 gob 打包递归定义的结构体

java - (业余程序员)自定义HashMap大小总是比预期小1?

sql - NOW() 不能用于查询(它不存在)

python - 使用 Python 3 获取文件的杂音哈希

c# - 覆盖默认的 HashAlgorithm.Create()

IE11 上的 Angular 4 性能/CPU 使用率

mysql - JOIN中子查询(GROUP BY)最高效的过滤位置

java - Java中计算大文件中以字符串开头的行的最快方法是什么

image - 以下一代格式提供图像 : Fallback Image?