C++ 具有缓慢插入性能的Boost多索引
我有以下代码(主要遵循这里的第一个示例:))。出于某种原因,由于多索引只有10000次插入,运行程序需要几分钟。我做错了什么,还是这是意料之中的事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*/
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 MODE和BOOST\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,否则不应该设置它。