C++ 具有缓慢插入性能的Boost多索引

C++ 具有缓慢插入性能的Boost多索引,c++,boost,C++,Boost,我有以下代码(主要遵循这里的第一个示例:))。出于某种原因,由于多索引只有10000次插入,运行程序需要几分钟。我做错了什么,还是这是意料之中的事 struct A { int id; int name; int age; A(int id_,int name_,int age_):id(id_),name(name_),age(age_){} }; /* tags for accessing the corresponding indices*/

我有以下代码(主要遵循这里的第一个示例:))。出于某种原因,由于多索引只有10000次插入,运行程序需要几分钟。我做错了什么,还是这是意料之中的事

struct A  
{  
  int id;  
  int name;  
  int age;  
  A(int id_,int name_,int age_):id(id_),name(name_),age(age_){}  
};  


/* tags for accessing the corresponding indices*/  
struct id{};  
struct name{};  
struct age{};  

typedef multi_index_container<  
  A,  
  indexed_by<  
    ordered_unique<  
      tag<id>,  BOOST_MULTI_INDEX_MEMBER(A,int,id)>,  
    ordered_non_unique<  
      tag<name>,BOOST_MULTI_INDEX_MEMBER(A,int,name)>,  
    ordered_non_unique<  
      tag<age>, BOOST_MULTI_INDEX_MEMBER(A,int,age)> >  
> A_set;  



int main()  
{  
  A_set es;  

  for (int a = 0; a != 10000; a++) {  
    es.insert(A(a,a+1,a+2));  
  }  
  return 0; 
}
结构A { int-id; int名称; 智力年龄; A(int-id,int-name,int-age):id(id),name(name),age(age){ }; /*用于访问相应索引的标记*/ 结构id{}; 结构名称{}; 结构年龄{}; typedef多索引容器< A. 索引由 有序_唯一< 标签,BOOST\u多索引成员(A,int,id)>, 有序的非唯一的 标记,BOOST\u多索引成员(A,int,name)>, 有序的非唯一的 标记,增强多索引成员(A,int,age)>> >一套; int main() { A_集es; 对于(inta=0;a!=10000;a++){ es.插入(A(A,A+1,A+2)); } 返回0; }
根据我自己使用
boost::bi_map
的经验(据我所知,这是基于多索引容器的),我不得不说,不幸的是,这些多索引容器相对较慢。然而,这并不是为了插入性能。所以我真的不明白你的情况为什么这么慢


我做了一个小的基准测试,比较了一个
boost::bi_map
和两个
boost::unordered_map
s。对于这两种方法,插入100000个唯一值大约需要1秒。但是,查询50000000个值对于无序的_映射是10秒,对于有序映射是26秒(即使用整数键)。(我们最好的内部数据结构大约在1秒内执行查找)。

您是否碰巧在调试模式下编译?它使用VisualStudio2008中的默认版本配置几乎立即完成。如果您在调试模式下编译,并且几乎完全遵循了示例,包括预处理器的内容,但仍然有以下部分:

#ifndef NDEBUG
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

然后,删除/禁用这些定义也将显著加快执行时间。(在我的机器上至少增加了180倍,没有费心让它完成。)我不知道在调试构建中禁用或删除这些东西的后果是什么。

几分钟似乎很慢-对于现代CPU来说,我最多只需要几秒钟。Boost倾向于使用许多小函数,这些函数在调试构建中的运行速度明显慢于优化的发布构建


还要验证是否未设置BOOST\u MULTI\u INDEX\u ENABLE\u SAFE\u MODEBOOST\u MULTI\u INDEX\u ENABLE\u INVARIANT\u CHECKING。它们都执行额外的运行时检查。

是否设置NDEBUG宏?如果我设置的话,代码会很快燃烧起来。谢谢你,我没意识到要看那里。我可能也应该在代码中包含它。请注意,强烈建议调试时使用
BOOST\u MULTI\u INDEX\u ENABLE\u SAFE\u MODE
。它不会导致您所看到的速度减慢,也不会在代码中发现细微的错误<代码>增强\多索引\启用\不变\检查是罪魁祸首。它检查boost代码中的bug,除非您怀疑boost代码有bug,否则不应该设置它。