我需要将
我已经尝试使用
1.
我的大部分操作都是修改哈希表中的值,有时我会删除所有元素,以便可以使用相同的已分配内存。
uint64
->[uint64
列表](每个哈希表的列表长度是恒定的)进行映射。我已经尝试使用
google::dense_hash_map
的两种方式:1.
google::dense_hash_map<uint64, std::array<uint64, 10>, Hash64> //这里以10为例
2. google::dense_hash_map<uint64, std::vector<uint64>, Hash64>
(1) 比(2)快得多(3倍)。问题是,我不想在编译时定义数组的大小,而是在定义哈希表时定义它,是否有其他可能的选项?我的大部分操作都是修改哈希表中的值,有时我会删除所有元素,以便可以使用相同的已分配内存。
std::unordered_map
相比,它看起来如何? - Yksisarvinengoogle::dense_hash_map
执行更快的原因与它使用的容器有关,而不是google::dense_hash_map
本身。相比于std::vector
,std::array
是一个更简单的容器,复制std::array
比复制std::vector
更为简单。实际代码可能存在一些低效的操作,例如通过值传递参数等,这会放大std::vector
在这方面的低效性。找到自己代码的低效之处并加以修复,问题并不在dense_hash_map
中。 - Sam Varshavchikstd::vector
将其元素存储在动态分配的缓冲区中,这涉及到访问元素时的间接寻址,并可能导致更多的缓存未命中。我不熟悉google::dense_hash_map
的内部机制,但我认为使用std::array
可以更紧凑地存储数组元素在内存中,因此较少需要(缓慢的)动态内存分配。 - Daniel Langr