我在我的程序上运行了一个分析器(非常困),它在我的重置功能上显示了很高的百分比(重置功能每帧运行)。 程序看起来像这样:
Init部分:
std::vector<std::vector<int>> VecOfVecOfPath;
VecOfVecOfPath.resize(20);
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640);
VecOfVecOfPath是其他函数找到的一系列路径。
VecOfVecOfPath [i]将在每帧执行期间填充。
例如。由其他函数push_back
编辑,并在使用前逐帧重置。
重置功能:
void Reset()
{
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear();
}
因此重置非常简单,但在探查器中确实有很高的排名。
这是常见的吗?即使对于内置类型向量,vector :: clear()是否也有这样的开销?谢谢!
我尝试在发布模式下构建程序,然后将成本降低到几乎为零。 从12~13%到0.03~0.04%。
然后我去了源代码,并且有像ITERATOR_DEBUG_LEVEL这样的定义在调试模式下影响额外的操作。
所以就像@noggin182建议的那样,在调试和发布模式下情况有所不同。
引用:&#34;请确保您在发布版本中进行概要分析并搜索是否有任何预处理器条件定义您设置为提升性能。 - noggin182 1月3日15:32&#34;
答案 0 :(得分: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]);
在没有任何更多信息的情况下,我可以提供尽可能多的帮助