作为std::hive/plf::hive的作者,我最近通过朋友了解了boost::hub,并进行了基准测试,与作者Joaquin进行了深入交流。虽然我们在一些细节上存在分歧,但总体上达成了一致意见,并互相学习了一些知识。以下的假设仅适用于当前版本的plf::hive和boost::hub,未来的实现可能会有所不同。
- 对于较小类型,Hub通常整体更快,而对于非常大类型,hive通常表现更佳。
- 插入操作在Hub中通常更快,除了大类型外。
- 删除操作在Hub中更快。
- 不同编译器的结果略有差异,但在测量插入和删除对迭代影响的测试中,使用48字节结构体时,hive在高频率的删除情况下表现更好。
- get_iterator()在最大块容量较小时性能较差,因为需要检查更多块才能找到指针位置,因此在默认或更大块大小的情况下,hub的性能显著低于hive。
- 排序操作在hub中更快,除了处理大量大类型时。
- 根据Joaquin的基准测试,hive在32位可执行文件中似乎比hub快很多,但我尚未对此进行基准测试。
此外,访问技术(visitation)是一个可以应用于任何半连续容器的技术,包括deques、unrolled lists等。它结合了迭代和预取,容器能够在迭代过程中知道下一个块的开始位置。不过,这种方法在使用时有限制,适合对一组元素执行相同操作,但不适合标准库的范围操作。
我的基准测试表明,孤立的插入、删除和迭代基准并不足以准确测量hive或类似容器在长期迭代中的表现,因为删除和保留的块会叠加,而不同容器的处理方式不同。总之,建议根据具体使用场景自行进行基准测试,虽然有上述指导原则,但在不同处理器上结果可能会有所不同。
博主点评: 本文提供的对比分析对于开发者选择适合的容器尤为重要。建议在真实应用场景中进行基准测试,以确保选择最优的实现方案。不同的数据类型和使用情况可能会显著影响性能表现。