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

Mar*_*Mao 6 c++ performance vector clear

我在我的程序上运行了一个分析器(非常困),它在我的重置功能上显示了很高的百分比(重置功能每帧运行).程序看起来像这样:

初始部分:

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

VecOfVecOfPath是其他函数找到的一系列路径.VecOfVecOfPath [i]将在每帧执行期间填充.例如,它push_back由其他功能组成,并在每帧使用前重置.

重置功能:

void Reset()
{
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear();
}
Run Code Online (Sandbox Code Playgroud)

所以重置非常简单,但在profiler中确实有很高的排名.

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

谢谢!


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

然后我去了源代码,并且有类似ITERATOR_DEBUG_LEVEL的定义,在调试模式下影响额外的操作.

所以就像@noggin182建议的那样,在Debug和Release模式下情况有所不同.

引用:"请确保你在发布版本中进行分析并搜索是否有任何预处理器条件定义你设置为提升性能. - noggin182 1月3日15:32"

nog*_*182 1

这取决于向量中的内容,如果嵌套向量包含类,那么您将为嵌套向量中的每个实例调用 d'tor。我很确定它也会释放内存。

听起来你在写游戏?如果是的话,我读过的一些关于游戏写作的书籍(PDF)表明矢量适合一般用途,但你最好不要将它用于游戏。只需使用本机数组并自己管理内存或推出自己的容器类。

640 是向量的上限吗?您使用这样的东西会更好吗?

sometype Values[20][640];
int size[20];
Run Code Online (Sandbox Code Playgroud)

那么你的重置电话可能就是

for(int i=0; i<20; i++) size[0] = 0;
Run Code Online (Sandbox Code Playgroud)

您甚至仍然可以使用任何 stl 函数,如下所示:

std::sort(Values[i], Values[i] + size[i]);
Run Code Online (Sandbox Code Playgroud)

这就是我能提供的尽可能多的帮助,无需更多信息

  • 对于缺乏经验的开发人员来说,“只使用原生数组”的建议绝对是万金油。这可能不是 STL 的问题,而是“你如何使用它”的问题。如果您确实认为 STL 是性能问题的重要根源,请尝试 [EASTL](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html),这是专门针对一些人希望 STL 具有的性能增强而编写。__但是__,在你为此烦恼之前,请绝对尝试其他一切,因为_这极不可能_STL中的额外开销是性能问题的__根源__。 (2认同)