删除vector中的元素需要永远完成

Deleting elements in vector takes forever to complete

本文关键字:永远 元素 vector 删除      更新时间:2023-10-16

我有一个指针向量,在执行程序中的其他任务之前,我确实需要确保使用的内存是空闲的。我不想依靠操作系统来管理对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!rn";
    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!rn" 
    << "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.

正如你所看到的,填充向量大约需要15秒,但消除它几乎需要17秒。

代码工作,对于1000000个元素,我得到了大约35MB的内存,然后在等待键部分之前,它开始收缩到大约1mb。但为什么这么慢呢?我该如何改善这种行为?

嗯…没有人愿意仔细阅读我的问题....不管怎样,是视觉工作室装傻…我独立运行程序,它花了不到100毫秒来填充和删除矢量!

改进是微不足道的:使用vector<int>而不是vector<int*>,因为每个指针只存储一个元素。

如果您的数据较大,并且您确实需要存储指针,请使用unique_ptrboost::ptr_vector。现在已经不是1980年了,你可以使用RAII。

至于缓慢的清理,这可能是因为你的运行时在它们的小分配结构中有很多条目,必须遍历它们才能找到正确的条目。

如果你需要有一个指针的向量,但需要更快的释放,尝试保持指针的向量,并保持实际数据在deque类容器(array<data_t,32>list,也许?你必须自己做索引维护,但它会加快删除(em>如果这是瓶颈)。