我有以下代码(主要遵循这里的第一个例子: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;
}
答案 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秒钟内执行查找。)