开放地址法无锁哈希表实现

本文对比了无锁哈希表(基于开放地址法和CAS实现)与带读写锁的GNU hash_map在并发场景下的性能。在不同利用率下,无锁哈希表展现出显著的性能优势,但高利用率时冲突可能导致性能下降。测试环境为Intel E5620 CPU和4GB内存,测试压力为2读2写线程处理大量数据。未来可能的改进方向包括动态调整哈希表大小以提高内存利用率。
摘要由CSDN通过智能技术生成

可爱的作者称之为世界上最简单最快的无锁哈希表,我姑且也起这个名字。

本文的工作主要在于测试 (gnu的hash_map+读写锁)vs (无锁哈希表),我的比较只比较运行时间,不比较内存开销。

这个是作者原文:  http://preshing.com/20130605/the-worlds-simplest-lock-free-hash-table/


实现这个无锁的哈希表,最主要的技术要点在于:

1、用了开放地址法实现哈希表,实际内存开销会大于拉链法

2、用了CAS(compare and swap)语义实现小于等于8byte变量的原子操作

我的测试环境:
CPU: Intel(R) Xeon(R) CPU    E5620  @ 2.40GHz
MEMORY: 4G
测试压力:2个线程读2个线程写,每个读/写(2<<22)的数据量。

测试结果:
1、无锁哈希表的利用率为50%(预分配的空间只填满25%):那么LockfreeHashtable完成读写的时间GnuHashmap的一半;
2、若无锁哈希表的利用率为25%:那么LockfreeHashtable完成读写的时间GnuHashmap的1/10;
3、如果无锁哈希表的利用率为100%,那么将会耗费大量的时间在解决冲突,找到合适的位置来放置新的key-value,性能将会急剧下降,惨不忍睹。

两个声明:
1)gnu的hash_map是可以预分配bucket的数量的,通过构造函数设置。在本测试中,无论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开放地址法是一种解决哈希冲突的方法,它通过在哈希表中寻找下一个可用的位置来存储冲突的元素。当哈希表的装载因子达到一定阈值时,需要进行扩容来保持哈希表的性能。下面是开放地址法哈希表扩容的步骤: 1. 创建一个新的更大的哈希表,通常是原哈希表大小的两倍。 2. 将原哈希表中的所有元素重新哈希到新的哈希表中。 3. 将新的哈希表替换为原哈希表。 在重新哈希的过程中,需要使用新的哈希函数来计算元素在新哈希表中的位置。常见的重新哈希方法有线性探测、二次探测和双重哈希等。 下面是一个示例代码,演示了开放地址法哈希表扩容过程: ```python class HashTable: def __init__(self, size): self.size = size self.keys = [None] * size self.values = [None] * size def hash_function(self, key): return key % self.size def rehash(self, key): return (key + 1) % self.size def put(self, key, value): index = self.hash_function(key) while self.keys[index] is not None: if self.keys[index] == key: self.values[index] = value return index = self.rehash(index) self.keys[index] = key self.values[index] = value def resize(self): new_size = self.size * 2 new_keys = [None] * new_size new_values = [None] * new_size for i in range(self.size): if self.keys[i] is not None: index = self.hash_function(self.keys[i]) while new_keys[index] is not None: index = self.rehash(index) new_keys[index] = self.keys[i] new_values[index] = self.values[i] self.size = new_size self.keys = new_keys self.values = new_values # 创建一个哈希表 hash_table = HashTable(5) # 添加元素 hash_table.put(1, 'A') hash_table.put(2, 'B') hash_table.put(3, 'C') hash_table.put(4, 'D') hash_table.put(5, 'E') # 扩容哈希表 hash_table.resize() # 输出扩容后的哈希表 print(hash_table.keys) print(hash_table.values) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值