最近遇到一个查找对应关系的需求,第一时间想到map,但是千万级的数据,于是使用了unordered_map。时间降低了3倍左右。
但是偶然看见网上有有人说手撸一个hashmap,最基本的链式的,都要比unordered_map要快,于是试了一下。
发现STL写的还挺有意思的。写说下和STL的对比。
| 手撸hashmap | STL-unordered_map | |
|---|---|---|
| 底层实现 | vector<slit> | Node** |
| 扩展表 | 素数表 | 总元素大小除负载因子/两倍桶大小/下一个素数 |
| hash函数 | (n ^ 0xdeadbeef) % curTableSize; | FNV-1a |
| 初始大小 | 53 | 10 |
| 扩展条件 | 数据量大于桶大小 | 数据量大于桶大小 |
其实实现都差不多,但是测试出来的数据却很有意思。
测试情况:
一亿的int数据
Ubuntu 14.04.5 LTS
gcc version 4.8.4
| map | unordered_map | 手撸hash_map | |
|---|---|---|---|
| 插入时间(ms) | 189264 | 55442 | 19055 |
| 查询时间(ms) | 98428 | 15796 | 2590 |
| 内存占用(M) | 4579 | 4201 | 4590 |
不知道为啥会快,也不知道为啥unordered_map内存占用会低。。。
看了源码,感觉实现的差不多啊,盲猜可能缺少了边界检查和类似的保障机制吧。
测试代码放在git上。
https://github.com/xixihahag/hash
本文对比了一亿int数据下,手撸HashMap、STL unordered_map及传统map的性能。手撸HashMap在插入和查询时间上显著优于STL版本,内存占用相近。测试环境为Ubuntu14.04.5LTS,gccversion4.8.4。
1454

被折叠的 条评论
为什么被折叠?



