结论似乎是 __gnu_pbds::gp_hash_table
更快。在没有 __gnu_pbds
的情况下手打似乎效率高超。
实验数据 1(各 600000 次操作,单位 ms,禁用优化):
容器 | insert |
find |
find (失败) |
at |
at (越界) |
operator[] |
operator[] (新建) |
---|---|---|---|---|---|---|---|
std::map<int, int> |
289 | 150 | 213 | 157 | 1253 | 157 | 362 |
std::unordered_map<int, int> |
136 | 30 | 28 | 31 | 1041 | 32 | 171 |
std::unordered_map<int, int, custom_hash> |
121 | 29 | 24 | 32 | 1076 | 30 | 156 |
std::multimap<int, int> |
265 | 149 | 214 | N/A | N/A | N/A | N/A |
std::unordered_multimap<int, int> |
152 | 33 | 28 | N/A | N/A | N/A | N/A |
std::unordered_multimap<int, int, custom_hash> |
167 | 43 | 11 | N/A | N/A | N/A | N/A |
__gnu_pbds::gp_hash_table<int, int> |
69 | 12 | 10 | N/A | N/A | 14 | 64 |
__gnu_pbds::cc_hash_table<int, int> |
89 | 15 | 7 | N/A | N/A | 13 | 86 |
self_implement_hash_table<int, int> |
95 | 25 | 36 | 21 | 1006 | 23 | 104 |
经实验,__gnu_pbds::gp_hash_table<int, int>
的 find(失败)测试在大约 $660000$ 后速度会大量降低,本人尚未发现原因。
实验数据 2(各 1000000 次操作,单位 ms,开启 O2 优化):
容器 | insert |
find |
find (失败) |
at |
at (越界) |
operator[] |
operator[] (新建) |
---|---|---|---|---|---|---|---|
std::map<int, int> |
89 | 49 | 29 | 51 | 1572 | 48 | 86 |
std::unordered_map<int, int> |
60 | 9 | 11 | 9 | 1607 | 7 | 68 |
std::unordered_map<int, int, custom_hash> |
69 | 10 | 14 | 10 | 1656 | 10 | 77 |
std::multimap<int, int> |
82 | 48 | 26 | ||||
std::unordered_multimap<int, int> |
62 | 9 | 10 | ||||
std::unordered_multimap<int, int, custom_hash> |
76 | 14 | 6 | ||||
__gnu_pbds::gp_hash_table<int, int> |
23 | <1 | <1 | 1 | >20000 | ||
__gnu_pbds::cc_hash_table<int, int> |
60 | 5 | 2 | 4 | 76 | ||
self_implement_hash_table<int, int> |
36 | 7 | 10 | 34 | 5319 | 9 | 41 |
operator[]
(新建)是最后一个被运行的测试。即,容器在执行中间 5 种访问时大小都是 $600000$,而非 $120000$。
测试机配置:AMD Ryzen 5 3600 6-Core Processor 3.60GHz, 8.00 GB RAM
环境配置:Windows 10 企业版 LTSC 1809 (x64)
编译器配置:g++ (tdm64-1) 4.9.2
(mingw-w64)
编译选项:-Wall -lm -O0/-O2 -DMIRAI_LOCAL -std=c++14 -fno-ms-extensions
测试代码:
1 |
|