最近遇到一個查找對應關係的需求,第一時間想到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