Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要将字符串存储为某些快速数据结构中对象的id_C++_C_Algorithm_Hash_Map - Fatal编程技术网

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

C++ 需要将字符串存储为某些快速数据结构中对象的id,c++,c,algorithm,hash,map,C++,C,Algorithm,Hash,Map,我正在为web服务器实现一个会话存储。键是字符串 存储的对象是指针。我试着用地图,但需要一些东西 更快。我将查找一个对象5-20次 和插入一样频繁 我尝试使用哈希映射,但失败了。我觉得我受到的约束比空闲时间多 我正在Linux下编写c/c++代码。 我不想承诺使用boost,因为我的web服务器将比boost寿命长。:) 这是一个高度相关的问题,因为硬件(ssd磁盘)是 变化很快。什么是正确的解决方案不会在2年内出现。您可以自己制作。但是boost或std::tr1::无序映射不应该有任何问题

我正在为web服务器实现一个会话存储。键是字符串 存储的对象是指针。我试着用地图,但需要一些东西 更快。我将查找一个对象5-20次 和插入一样频繁

我尝试使用哈希映射,但失败了。我觉得我受到的约束比空闲时间多

我正在Linux下编写c/c++代码。 我不想承诺使用boost,因为我的web服务器将比boost寿命长。:)

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

您可以自己制作。但是boost或std::tr1::无序映射不应该有任何问题


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

我本来打算建议使用
映射,但我知道您已经排除了这一点

我试着用地图,但需要一些东西 更快

这些是std::map性能界限,由以下人员提供:

  • 搜索元素需要O(logn)时间
  • 插入新元素需要O(logn)时间
  • 递增/递减迭代器需要O(logn)时间
  • 遍历映射的每个元素需要O(n)个时间
  • 删除单个映射元素需要O(logn)时间
  • 复制整个映射需要O(n logn)时间
您是如何测量和确定地图未充分优化的?很有可能您看到的任何瓶颈都存在于代码的其他部分,而
map
就足够了


上述界限似乎适用于除最严格的可扩展性要求之外的所有要求。

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

  • 会话存储中将有多少项?50? 100000? 一百万
  • 商店中的每个项目有多大(字节大小)
  • 键使用哪种类型的字符串输入?ASCII-7?UTF-8?UCS2?
  • 哈希表通常可以很好地进行查找。您可以通过自己编写它们来大幅优化它们的速度(是的,您可以调整表的大小)。提高哈希表性能的建议:

  • 选择一个好的散列函数!这最好在散列表中均匀分布,并且不会占用大量的计算时间(这取决于键输入的格式)
  • 如果使用铲斗,请确保铲斗长度不超过6。如果确实超过6个存储桶,则哈希函数的分布可能不够均匀。铲斗长度最好小于3
  • 注意如何分配对象。如果可能的话,试着在内存中将它们分配到彼此相邻的位置,以利用引用的局部性。如果需要,可以编写自己的子分配器/堆管理器。还要保持对齐边界以获得更好的访问速度(对齐取决于处理器/总线,因此您必须确定是否要针对特定的处理器类型)
  • B树也非常好,通常表现良好。(有人可以在此处插入有关btrees的信息)

    我建议查看您存储的数据,并确保数据尽可能小。根据需要使用短字符、无符号字符和位字段。还有其他一些方法可以提高性能,比如在分配结构的同时在结构的末尾分配字符串数据。i、 e

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

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

    什么意思,您尝试使用哈希映射但失败了?我发现快速Web服务器不太可能需要大量的字符串查找。根据定义,Web服务器有一个很大的I/O组件。你将如何做超过1000个字符串查找?如果Boost的生存期延长,很可能是因为它们的所有库都被包含在C++标准中。听起来无序的_图(boost版本at)是一个不错的选择。如果这是不可接受的,您应该清楚地解释/why/,以及您对更快版本的想法。James因为您在Linux上,如果您使用的是它附带的gcc(v4.0及更高版本)的较新版本。不需要使用Boost#包括并使用std::tr1::unordered_map代替std::map.+1来推荐评测,以找到真正的性能瓶颈。