Удаление элементов в векторе занимает целую вечность

У меня есть вектор указателей, которые мне действительно нужны, чтобы убедиться, что используемая память свободна, прежде чем продолжить выполнение других задач в программе. Я не хочу полагаться на операционную систему для управления вызовами delete поэтому я хочу сделать это самостоятельно, потому что позже я хочу переместить этот код на встроенную платформу с ограниченной памятью. Я написал код ниже, чтобы проверить простой сценарий: Я выбрал указатель int только для примера … фактические данные могут быть чем-то другим! например POD или класс

#include <vector>
#include <iostream>
#include <Windows.h>

#define NUM_ELEMENTS    1000000

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
LARGE_INTEGER li;
if (!QueryPerformanceFrequency(&li))
std::cout << "QueryPerformanceFrequency failed!\r\n";

PCFreq = double(li.QuadPart) / 1000.0;

QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart - CounterStart) / PCFreq;
}

int main()
{
/***** CREATE VECTOR **********/
std::cout << "Generating " << NUM_ELEMENTS
<< " elements." << std::endl;

StartCounter();
std::vector<int *>* vec = new std::vector<int*>;
for (size_t i = 0; i < NUM_ELEMENTS; i++)
{
vec->push_back(new int(i));
}

std::cout <<  vec->size() << " Have been generated in "<< GetCounter() << "ms" << std::endl;
std::cout << "Destroying the vector..." << std::endl;

/***** DELETE VECTOR **********/

StartCounter();

while (!vec->empty())
{
delete vec->back(), vec->pop_back();
}

vec->clear();
delete vec;

std::cout << "It took " << GetCounter() << "ms to empty the vector!\r\n"<< "Press ENTER to exit." << std::endl;

//wait for key to exit
std::cin.get();

return 0;
}

А вот и вывод на консоль:

Generating 1000000 elements.
1000000 Have been generated in 1077.96ms
Destroying the vector...
It took 16834.9ms to empty the vector!
Press ENTER to exit.

Как вы можете видеть, для заполнения вектора требуется около 1 с, но от него требуется почти 17 с.

Код работает, для 1000000 элементов я получаю около 35 МБ памяти, а затем он начинает сокращаться до 1 МБ как раз перед частью ключа ожидания. Но почему это так медленно? как я могу улучшить это поведение?

Хммм …. никто не заботился о том, чтобы внимательно прочитать мой вопрос … в любом случае, это была визуальная студия, играющая глупо … Я запустил программу автономно, и для заполнения и удаления вектора понадобилось менее 100 мс! надеюсь, что этот опыт полезен и для других

0

Решение

Улучшение тривиально: используйте vector<int> вместо vector<int*>, поскольку вы храните только один элемент на указатель.

Если ваши данные больше и вам действительно нужно хранить указатели, используйте unique_ptr или же boost::ptr_vector, Это уже не 1980 год, вы можете использовать RAII.

Что касается медленной очистки, это, вероятно, потому что ваша среда выполнения имеет много записей в своих небольших структурах размещения и должна пройти их все, чтобы найти правильную.

Если вам нужен вектор указателей, но требуется более быстрое освобождение, попробуйте сохранить вектор указателей как есть и сохранить фактические данные в dequeконтейнер ( list из array<data_t,32>возможно? Вы должны были бы вести индексирование самостоятельно, но это ускорило бы удаление если это узкое место).

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector