У меня есть существующий алгоритм, и мне нужно немного его оптимизировать, если это возможно. В настоящий момент нельзя сильно менять этот алгоритм. Алгоритм работает с экземпляром 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());