vector::clear() 花费这么多时间?

Posted

技术标签:

【中文标题】vector::clear() 花费这么多时间?【英文标题】:vector::clear() cost so much time? 【发布时间】:2012-01-03 14:50:02 【问题描述】:

我在我的程序上运行了一个分析器(非常困),它在我的重置功能上显示了很高的百分比(重置功能每帧运行)。 程序如下所示:

初始化部分:

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

VecOfVecOfPath 是其他函数找到的一系列路径。 VecOfVecOfPath[i] 将在执行期间按帧填充。 例如。由其他函数push_back-ed,并在使用前重置,每帧。

重置功能:

void Reset()

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

所以重置很简单,但在profiler中排名确实很高。

这很常见吗?即使对于内置类型向量,vector::clear() 是否也有这样的开销?

谢谢!


我尝试在发布模式下构建程序,然后成本降低到几乎为零。 从 12~13% 到 0.03~0.04%。

然后我去了源代码,并且有像 ITERATOR_DEBUG_LEVEL 这样​​的定义在调试模式下影响额外的操作。

所以就像@noggin182 建议的那样,Debug 和 Release 模式是不同的。

引用:“请确保您在发布版本中进行分析并搜索以查看您是否设置了任何预处理器条件定义以提高性能。– noggin182 1 月 3 日 15:32”

【问题讨论】:

你有没有想过你给clear打电话是不必要的? @parapurarajkumar - 我也想到了第一件事。我认为我们需要更多关于“VecOfVec”使用的细节——也许 Vecs 可以被回收以避免清除。 “不必要”是什么意思?即使我不需要清除它们也不必要地清除它们? clear 的成本正是析构函数调用的成本。检查那些是否也很昂贵。 @Marson:在那种情况下,肯定有些奇怪。 std::vector&lt;int&gt;::clear() 应该等同于 __end_ptr == __start_ptr__size = 0,它们是数据成员。因此它应该非常快,你不应该注意到每帧调用它 20 次(好吧,与每帧将那些 20*640 元素放入向量中相比)。 【参考方案1】:

这取决于您的向量中的内容,如果您的嵌套向量包含类,那么您将为嵌套向量中的每个实例调用 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]);

在没有任何更多信息的情况下,我能提供的帮助已经差不多了

【讨论】:

它是 int 类型的,所以我认为 clear()-ing 它不会花费太多时间。如果我正确地为它保留(),我认为本机数组与向量相同?然后向量不会重新分配,所以它很快。 好的,如果它是一个 int 向量,那么我会认为这不应该那么慢。你用的是什么编译器?我没有看过向量的所有实现,但我很惊讶它们在 MSVC、Borland 和 GCC 之间有多么不同。它们也都有开关来启用某些健全性和调试检查,并执行范围检查和屏蔽等任务,确保您只在它们打算用于的容器上使用迭代器。确保您在发布版本中进行分析并搜索以查看是否设置了任何预处理器条件定义以提高性能。 我正在使用 VS2010 专业版。我会在今天早上晚些时候尝试发布版本并报告结果,谢谢! “只使用原生数组”的建议对于没有经验的开发人员来说绝对是万金油。这可能不是 STL,而是 您如何使用它 这就是问题所在。如果您真的认为 STL 是性能问题的重要来源,请尝试 EASTL,它专门编写了一些人希望 STL 具有的性能增强功能。 但是,在您为此烦恼之前,请绝对尝试其他所有方法,因为 极不可能 STL 中的额外开销是性能的来源问题。 我强烈建议不要使用 stl。您可以使用向量并在创建它们时使用 reserve() 以防止多次调整大小,并且它几乎充当一个数组,除了您不必记住删除它。至于原来的问题,如果你用优化编译(发布模式)应该不会发生!

以上是关于vector::clear() 花费这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PyYAML 仅仅在解析 YAML 文件上花费了这么多时间?

为啥 vector::clear 不从向量中删除元素?

C++ vector::clear() - 破坏顺序? [复制]

为啥这段代码可以正常工作? (vector.clear(), vector<vector<int>>)

初始化 Spring 应用程序时如何确定哪个方法花费了这么长时间

vector.clear()后程序崩毁原因分析(单例与智能指针)