vector :: clear () стоит столько времени? - PullRequest
6 голосов
/ 03 января 2012

Я запустил профилировщик (очень сонный) в моей программе, и он показывает высокий процент в моей функции сброса (функция сброса запускается для каждого кадра).Программы выглядят так:

Раздел инициализации:

std::vector<std::vector<int>> VecOfVecOfPath;
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640);

VecOfVecOfPath - это последовательность путей, найденная другими функциями.VecOfVecOfPath [i] будет заполняться во время выполнения для каждого кадра.Например, push_back -подключается другими функциями и сбрасывается перед использованием для каждого кадра.

Функция сброса:

void Reset()
{
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear();
}

Таким образом, сброс очень прост, но он делаетимеют довольно высокий рейтинг в профилировщике.

Это часто встречается?Есть ли у vector :: clear () такие издержки даже для векторов встроенного типа?

Спасибо!


Я пытался собрать программу в режиме Release, а затем стоимость снизилась допочти ноль.От 12 ~ 13% до 0,03 ~ 0,04%.

Затем я перешел к исходному коду и есть определения, например ITERATOR_DEBUG_LEVEL, выполняющие дополнительные операции в режиме отладки.

Так что это похоже на @ noggin182Предполагается, что в режиме отладки и выпуска все по-другому.

Цитата: «Убедитесь, что вы профилируете в сборке выпуска и выполните поиск, чтобы увидеть, есть ли какие-то условные выражения препроцессора, которые вы настроили для повышения производительности. - noggin182 3 января в15:32"

1 Ответ

1 голос
/ 03 января 2012

Это зависит от того, что находится в вашем векторе, если ваши вложенные векторы содержат классы, вы будете вызывать d'tor для каждого экземпляра во вложенных векторах. Я совершенно уверен, что это также освободит память.

Звучит так, будто ты пишешь игру? Если так, то несколько книг (PDF-файлов), которые я читал по написанию игр, предполагают, что вектор хорош для общего использования, но вам будет лучше НЕ использовать его для игр. Просто используйте собственные массивы и управляйте памятью самостоятельно или создайте собственный контейнерный класс.

Является ли 640 верхней границей вашего вектора? Не лучше ли использовать что-то подобное?

sometype Values[20][640];
int size[20];

Тогда ваш сброс может быть просто

for(int i=0; i<20; i++) size[0] = 0;

Вы по-прежнему сможете использовать любые функции stl, например:

std::sort(Values[i], Values[i] + size[i]);

Это примерно столько помощи, сколько я могу предоставить без дополнительной информации

...