我需要在一个高性能的哈希映射数据结构中将原始键(int,可能是long)映射为结构体值。
我的程序将有几百个这样的映射表,每个映射表通常最多只有几千个条目。但是,这些映射表将不断地“刷新”或“翻转”;想象一下每秒处理数百万条“add”和“delete”消息。
在C或C++中,有哪些库提供了适合此用例的数据结构?或者,您如何建议构建自己的数据结构?谢谢!
我需要在一个高性能的哈希映射数据结构中将原始键(int,可能是long)映射为结构体值。
我的程序将有几百个这样的映射表,每个映射表通常最多只有几千个条目。但是,这些映射表将不断地“刷新”或“翻转”;想象一下每秒处理数百万条“add”和“delete”消息。
在C或C++中,有哪些库提供了适合此用例的数据结构?或者,您如何建议构建自己的数据结构?谢谢!
我建议你尝试使用Google SparseHash(或C11版本的Google SparseHash-c11),看看它是否适合你的需求。它们有一个内存高效的实现,也有一个针对速度进行了优化的实现。
我很久以前进行过基准测试,这是速度方面表现最佳的哈希表实现(但有一些缺点)。
默认情况下,只需使用 boost::unordered_map
(或 tr1
等)即可。然后对代码进行剖析,查看该代码是否成为瓶颈。只有在此之后才建议精确分析您的要求,寻找更快的替代方法。
std::unordered_map
却占据了我整个执行时间的90%以上。 - CameronKhash非常高效。作者详细的基准测试结果在这里:https://attractivechaos.wordpress.com/2008/10/07/another-look-at-my-old-benchmark/,它还展示了Khash打败了许多其他哈希库。
从Android源代码中获取(因此采用Apache 2许可证)
https://github.com/CyanogenMod/android_system_core/tree/ics/libcutils
查看hashmap.c,选择include/cutils/hashmap.h,如果您不需要线程安全,可以删除mutex代码,libcutils/str_parms.c 中提供了一个示例实现。
首先,检查现有的解决方案,例如libmemcache是否符合您的需求。
如果不符合...
哈希映射似乎是满足您要求的明确答案。它提供基于键的o(1)查找。大多数STL库现在都提供某种哈希。因此,请使用平台提供的哈希。
完成这部分后,您必须测试解决方案,以确定默认哈希算法在性能上是否足够满足您的需求。
如果不是,则应探索一些在网络上找到的良好快速哈希算法
如果这还不够好,您可以自己编写哈希模块,该模块可以修复您测试过的STL容器中出现的问题,并使用上述其中一种哈希算法。请务必在某个地方发布结果。
哦,有趣的是您有多个映射...也许您可以通过将密钥作为64位数字,并使用高位来区分它属于哪个映射,并将所有键值对添加到一个巨大的哈希中来简化。我已经看到了具有十万左右符号的哈希完美地在基本质数哈希算法上运行良好。
您可以检查该解决方案与数百个映射相比的性能..我认为从内存分析的角度来看这可能更好...如果您确实进行了此练习,请在某个地方发布结果
我相信与哈希算法相比,常量添加/删除内存(是否可以避免?)和CPU缓存使用配置文件可能更关键,这对您的应用程序的性能更为重要
祝您好运
closed_hash_map
速度与Google的dense_hash_map
相当,但更易于使用(不限制所包含的值),而且还有其他一些好处。请注意保留HTML标签。http://incise.org/hash-table-benchmarks.html gcc有非常好的实现。但是请注意,它必须遵守一个非常糟糕的标准决定:
如果发生重新散列,所有迭代器都将无效,但对单个元素的引用和指针仍然有效。如果没有实际重新散列发生,则不会更改。
http://www.cplusplus.com/reference/unordered_map/unordered_map/rehash/
这基本意味着标准规定实现必须基于链表。它防止了具有更好性能的开放寻址。