std :: vector > или std :: deque >?

У меня есть существующий алгоритм, и мне нужно немного его оптимизировать, если это возможно. В настоящий момент нельзя сильно менять этот алгоритм. Алгоритм работает с экземпляром std :: vector > . Это выглядит так:

typedef std::vector internal_vector_t;
std::vector< internal_vector_t > internal_vectors; 

while (fetching lots of records) {
   internal_vector_t tmp;
   // reads 1Mb of chars in tmp...
   internal_vectors.push_back(tmp);
   // some more work
}

// use this internal_vectors

Алгоритм много раз вставляет экземпляры internal_vectors внутреннего_vector_t с помощью push_back (). Большинство экземпляров internal_vector_t имеют размер 1 Мб . Поскольку размер internal_vectors неизвестен, заранее не выполняется резерв ().

Первое, чего я не понимаю, - это то, что происходит, когда internal_vectors достигает своей текущей емкости, ему необходимо выделить новый блок и скопировать его текущее содержимое в больший блок памяти. Поскольку большая часть блоков имеет размер 1Мб, копирование - долгая операция. Стоит ли ожидать, что компилятор (gcc 4.3, MS VC ++ 2008) сможет оптимизировать его, чтобы избежать копирования ?

Если копирование неизбежно, изменится ли на std :: deque help ? Я рассматриваю std :: deque, потому что мне все еще нужен доступ по индексу, например, internal_vectors [10]. Примерно так:

typedef std::vector internal_vector_t;
std::deque< internal_vector_t > internal_vectors; 
// the same while

Насколько я понимаю, std :: deque не требует перемещения, которое когда-то было выделено. Я прав, что std :: deque в этой ситуации потребует меньше выделения и копирования для push_backs?


Обновление:

1) Согласно DeadMG MSVC9 выполняет этот тип оптимизация (Оптимизация подкачки - Исправления TR1 в VC9 SP1 ). gcc 4.3, вероятно, не выполняет такого рода оптимизацию.

2) Я профилировал версию алгоритма, которая использует std :: deque > , и я вижу, что его производительность лучше.

3) Я также использовал своп , который был предложен Марком Рэнсомом . Использование этого улучшило производительность:

   internal_vector_t tmp;
   internal_vectors.push_back(empty);
   tmp.swap(internal_vectors.back());

5
задан Community 23 May 2017 в 12:20
поделиться