У меня есть существующий алгоритм, и мне нужно его оптимизировать, если это возможно.В данный момент многое изменить в этом алгоритме невозможно.Алгоритм работает с экземпляром std::vector< std::vector<unsigned char> >
.Это выглядит так:
typedef std::vector<unsigned char> 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
экземпляры internal_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<unsigned char> internal_vector_t;
std::deque< internal_vector_t > internal_vectors;
// the same while
Насколько я понимаю, std::deque
не требует перемещения, которое было когда-то выделено.Прав ли я, что std::deque
в этой ситуации потребует меньше выделения и копирования на push_backs?
Обновление: 1) Согласно DeadMG MSVC9 выполняет этот тип оптимизации (The Swaptimization - TR1 Исправления в VC9 SP1 ).gcc 4.3, вероятно, не выполняет этот тип оптимизации.
2) Я профилировал версию алгоритма, которая использует std::deque< std::vector<unsigned char> >
, и я вижу, что его производительность лучше.
3) Я также использовал swap
, который былпредложено Марк Рэнсом .Использование этого улучшило производительность:
internal_vector_t tmp;
internal_vectors.push_back(empty);
tmp.swap(internal_vectors.back());