У меня есть следующий код (который в основном следует первому примеру здесь: http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/examples.html)). По некоторым причинам, только с 10 000 вставок к мультииндексу, требуется несколько минут для запущения программы. Я делаю что-то не так, или это ожидается?
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, BOOST_MULTI_INDEX_MEMBER(A,int,id)>,
ordered_non_unique<
tag,BOOST_MULTI_INDEX_MEMBER(A,int,name)>,
ordered_non_unique<
tag, 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;
}
Вы случайно не компилируете в режиме отладки? Она завершается почти мгновенно с конфигурацией релиза по умолчанию в Visual Studio 2008. Если вы компилируете в режиме отладки и почти полностью следуете примеру, включая все препроцессорные вещи, и все равно имеете эту часть:
#ifndef NDEBUG
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif
Тогда удаление/отключение этих defines также значительно ускорит время выполнения. (По крайней мере в 180 раз на моей машине, я не стал доводить дело до конца.) Каковы последствия отключения или удаления этих вещей в отладочной сборке, я не знаю.
Несколько минут кажутся очень медленными - я бы ожидал секунды максимум для современного процессора. Boost имеет тенденцию использовать множество небольших функций, которые в отладочной сборке выполняются значительно медленнее, чем оптимизированная сборка выпуска.
Также убедитесь, что BOOST_MULTI_INDEX_ENABLE_SAFE_MODE и BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING не установлены. Оба они выполняют дополнительную проверку во время выполнения.
Исходя из моего собственного опыта работы с boost::bi_map
(который, насколько мне известно, основан на мультииндексных контейнерах), я должен сказать, что эти мультииндексные контейнеры, к сожалению, относительно медленные. Однако это не для вставки производительности. Так что я не очень понимаю, почему это так медленно в вашем случае.
Я сделал небольшой тест, сравнивая boost::bi_map
с двумя boost::unordered_map
s. Вставка 100'000 уникальных значений занимает около 1 секунды для обоих подходов. Однако запрос 50000000 значений занимает 10 секунд для unordered_map и 26 секунд для упорядоченной карты (то есть с использованием целочисленных ключей). (Наша лучшая собственная структура данных выполняет поиск примерно за 1 секунду).