Повышение мультииндекса с медленной скоростью вставки - PullRequest
5 голосов
/ 06 июля 2010

У меня есть следующий код (который в значительной степени следует первому примеру здесь: 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 ]

12 голосов
/ 06 июля 2010

Вы случайно не компилируете в режиме отладки?Он заканчивается почти мгновенно с конфигурацией выпуска по умолчанию в Visual Studio 2008. Если вы компилируете в режиме отладки, и вы почти следовали примеру до буквы, включая материал препроцессора, и все еще содержали эту часть:

#ifndef NDEBUG
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

Тогда удаление / отключение этих определений также значительно ускорит время выполнения.(По крайней мере 180 раз на моей машине не удосужились дать ему закончить.) Каковы последствия отключения или удаления этих вещей в отладочной сборке, я не знаю.

4 голосов
/ 06 июля 2010

Несколько минут кажутся очень медленными - я бы ожидал самое большее секунды для современного процессора. Boost имеет тенденцию использовать множество небольших функций, которые в отладочной сборке выполняются значительно медленнее, чем оптимизированная сборка выпуска.

Также убедитесь, что BOOST_MULTI_INDEX_ENABLE_SAFE_MODE и BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING не установлены. Оба они выполняют дополнительную проверку во время выполнения.

1 голос
/ 06 июля 2010

Из моего собственного опыта работы с boost::bi_map (насколько мне известно на основе многоиндексных контейнеров) я должен сказать, что эти многоиндексные контейнеры, к сожалению, относительно медленные.Это не для вставки производительности, однако.Так что я не очень понимаю, почему это так медленно в вашем случае.

Я провел небольшой тест, сравнивая boost::bi_map с двумя boost::unordered_map с.Вставка 100 000 уникальных значений составляет около 1 секунды для обоих подходов.Однако запрос значений 50000000 составляет 10 секунд для unordered_map и 26 секунд для упорядоченной карты (то есть с использованием целочисленных ключей).(Наша лучшая внутренняя структура данных выполняет поиск примерно за 1 секунду).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...