需要在某些快速数据结构中将字符串存储为对象的id

时间:2009-05-08 04:53:27

标签: c++ c algorithm hash map

我正在为Web服务器实现会话存储。键是字符串 和存储的对象是指针。我尝试使用地图但需要一些东西 快点。我会查找一个物体5-20次 比插入频繁。

我尝试使用哈希映射但失败了。我觉得我有更多的限制而不是更多的空闲时间。

我在Linux下编写c / c ++编码。 我不想承诺提升,因为我的网络服务器将会超过提升。 :)

这是一个高度相关的问题,因为硬件(ssd磁盘)是 变化很快。什么是正确的解决方案不会在两年内。

3 个答案:

答案 0 :(得分:5)

我打算建议map,但我知道你已经排除了这一点。

  

我尝试使用地图但需要一些东西   更快。

这些是Wikipedia page提供的std :: map性能界限:

  • 搜索元素需要O(log n)时间
  • 插入新元素需要O(log n)时间
  • 递增/递减迭代器需要O(log n)时间
  • 迭代地图的每个元素需要O(n)时间
  • 删除单个地图元素需要O(log n)时间
  • 复制整个地图需要O(n log n)时间。

您如何衡量并确定地图未经充分优化?你看到的任何瓶颈都很可能出现在代码的其他部分,map就足够了。

上述界限似乎符合最严格的可扩展性要求。

答案 1 :(得分:2)

将使用的数据结构类型取决于您要访问的数据。你应该问一些问题:

  1. 会话商店中有多少件商品? 50? 100000?百亿?
  2. 商店中的每件商品的大小(字节大小)?
  3. 密钥使用什么类型的字符串输入? ASCII-7? UTF-8? UCS2? ...
  4. 哈希表通常对查找效果非常好。您可以通过自己编写来大大优化速度(是的,您可以调整表格大小)。使用哈希表提高性能的建议:

    1. 选择一个好的哈希函数!这将优先在您的哈希表中进行均匀分配,并且不会耗费大量时间(这将取决于键输入的格式)。
    2. 确保如果您使用的存储桶长度不超过6个。如果超过6个存储桶,那么您的哈希函数可能分布不均匀。铲斗长度<1。优选3。
    3. 注意如何分配对象。如果可能的话,尝试在内存中将它们彼此靠近分配,以利用引用的局部性。如果需要,编写自己的子分配器/堆管理器。同时保持对齐边界以获得更好的访问速度(对齐处理器/总线取决于您必须确定是否要定位特定处理器类型)。
    4. BTrees也很好,一般表现不错。 (有人可以在这里插入关于btree的信息)。

      我建议您查看要存储的数据,并确保数据尽可能小。根据需要使用short,unsigned char,bit字段。还有其他方法可以挤出改进的性能,例如在分配结构的同时在结构的末尾分配字符串数据。即。

      struct foo {
        int a;
        char my_string[0]; // allocate an instance of foo to be 
                           // sizeof(int) + sizeof(your string data) etc
      }
      

      您可能还会发现实现自己的字符串比较例程实际上可以显着提高性能,但这取决于您的输入数据。

答案 2 :(得分:1)

可以制作自己的。但是你不应该对boost或std :: tr1 :: unordered_map有任何问题。

对于较少数量的元素,三元组可能比哈希映射更快。