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

时间:2010-07-06 11:10:47

标签: c++ boost

我有以下代码(主要遵循这里的第一个例子:http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/examples.html))。由于某种原因,对于多索引只有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; 
}

3 个答案:

答案 0 :(得分:12)

您是否有机会在调试模式下编译?它使用Visual Studio 2008中的默认发布配置即刻完成。如果您正在调试模式下进行编译,并且几乎按照示例的说法,包括预处理器的东西,仍然有这部分:

#ifndef NDEBUG
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

然后删除/禁用这些定义也将大大加快执行时间。 (在我的机器上至少180x,没有让它完成。)在调试版本中禁用或删除这些内容的后果是,我不知道。

答案 1 :(得分:4)

几分钟似乎非常慢 - 我希望现代CPU的时间最长。 Boost倾向于使用许多小函数,这些函数在调试构建中的运行速度明显慢于优化版本构建。

同时验证未设置 BOOST_MULTI_INDEX_ENABLE_SAFE_MODE BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING 。这些都执行额外的运行时检查。

答案 2 :(得分:1)

根据我自己对boost::bi_map的经验(据我所知,基于多索引容器),我不得不说那些多索引容器很遗憾。但是,这不是为了插入性能。所以我真的不明白你为什么这么慢。

我做了一个比较boost::bi_map到两个boost::unordered_map的小基准。对于两种方法,插入100'000个唯一值约为1秒。但是,对于unordered_map,查询50000000值为10秒,对于有序映射(即使用整数键),查询为26秒。 (我们最好的内部数据结构在大约1秒钟内执行查找。)