什么更快:重新创建或清除()?
what's faster: recreate or clear()?
我有一个关于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
将销毁每个元素。第三,所有累积的数据最终都需要销毁。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 清除字符 (?) 以在C++中创建多个文件名
- 如果未在本机方法中创建,何时清除本地引用
- 创建和清除结构数组
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引
- 哪个更高效/更整洁:清除现有字符串流还是创建新字符串流
- 不停止,清除cin创建无限循环
- 什么更快:重新创建或清除()?
- 如何创建未清除的文件