Мультииндекс повышения с медленной производительностью вставки

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

5
задан Matthieu M. 6 July 2010 в 14:32
поделиться

3 ответа

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

#ifndef NDEBUG
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
#endif

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

12
ответ дан 18 December 2019 в 09:47
поделиться

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

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

4
ответ дан 18 December 2019 в 09:47
поделиться

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

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

1
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: