作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
- cnblogs博客
 - zhihu
 - Github
 - 公众号:一本正经的瞎扯

 
我仍然在尝试优化 VictoriaLogs 的性能,手贱开始改以下这个函数:
// lib/logstorage/bloomfilter.go
func initBloomFilter(bits, hashes []uint64) {
	maxBits := uint64(len(bits)) * 64 // bitmap 的总 bit 数
	for _, h := range hashes {
		idx := h % maxBits // hash 值落到哪一位 . //??? 有没有更快的计算方法
		i := idx / 64      // 落到哪一个数组下标
		j := idx % 64      // 落到一个 uint64 中的哪个 bit
		mask := uint64(1) << j
		w := bits[i]         // 取出对应位置的 uint64
		if (w & mask) == 0 { // 如果这一位没有 set
			bits[i] = w | mask // 把这一位 set 进去
		}
	}
}
看到上面的代码,我第一想法是:那个条件判断明显可以去掉啊,反正重复对某个 bit 位 set 1 也没错。
于是:
func initBloomFilter(bits, hashes []uint64) {
	maxBits := uint64(len(bits)) * 64 // bitmap 的总 bit 数
	for _, h := range hashes {
		idx := h % maxBits // hash 值落到哪一位 . //??? 有没有更快的计算方法
		i := idx / 64      // 落到哪一个数组下标
		j := idx % 64      // 落到一个 uint64 中的哪个 bit
		mask := uint64(1) << j
		w := bits[i] // 取出对应位置的 uint64
		// if (w & mask) == 0 { // 如果这一位没有 set
		// 	bits[i] = w | mask // 把这一位 set 进去
		// }
		bits[i] = w | mask
	}
}
去掉了 if 判断,性能下降了 21.2%.
 Why ?
 解释就在我的标题上:如果是读的算法,就不要做成写的算法。
 不要低估“内存墙”有多慢。
 bits[i] 是随机访问的,if 语句能够减少数据随机写回内存。
 去掉 if 后,写变多了,自然就慢了。
来源链接:https://www.cnblogs.com/ahfuzhang/p/18926565
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
    















暂无评论内容