什么更快:重新创建或清除()?

what's faster: recreate or clear()?

本文关键字:清除 创建 新创建 什么      更新时间:2023-10-16

我有一个关于std::vector<>在c++中的性能的问题。通过调用其clear()方法来重用相同的向量是否更快,或者重新创建向量是否更快?

下面的例子不是现实生活中的代码,它只是为了弄清楚问题是什么:

//Example ONE: is this faster
std::vector<int> foo;
for(int i = 0; i < 100; ++i)
{
    foo.clear();
    for(int j = 0; j < 100; ++j)
    {
        foo.push_back(i+j);
    }
}
//Example TWO: or is that faster?
for(int i = 0; i < 100; ++i)
{
    std::vector<int> foo;
    for(int j = 0; j < 100; ++j)
    {
        foo.push_back(i+j);
    }
}

clear()不能通过它的契约释放vector的内存,而只是将内部的"size"标志设置为0,因此该方法将更快。

这取决于您正在使用的c++标准库中std::vector的实现,但是第一种情况可能会更快,因为大多数实现在调用std::vector::clear时实际上并没有释放已分配的内存。因此,一旦内部循环第一次执行,第一个就不会执行重复的分配。

是。不。第一个可能更快。视情况而定。唯一有用的答案来自您在自己的环境中分析自己的代码。

试着分析你的代码,看看会发生什么。在ideone上编译你的程序会发现,对于一个特定的编译器/os/机器/运行,你的第一个例子要快4倍。

这个程序显示了一个中间解决方案,它比#2快,比#1慢,对于这个特定的编译器/os/machine/run。

例2为std::vector中的数组重复了堆分配。例1更快,因为它避免了在堆上重复分配内存,除非向量需要在内部调整大小。

您必须为编译器运行基准测试。clear()和'allocate'方法是与实现相关的。

要清除矢量并将其容量减小到实现的最小值,Scott Meyers建议使用交换技巧:

std::vector<int>().swap( foo );

这也比使用手动循环遍历vector来恢复其内容要快。

在这种情况下,重用情况在大多数机器上可能会更快。您正在存储不需要析构函数(甚至不需要析构函数)的原始数据。另一方面,如果vector包含非pod对象,则调用clear将销毁每个元素。第三,所有累积的数据最终都需要销毁。