2012-01-03 38 views
5

我在程序中运行了一个分析器(非常困倦),并且在我的重置功能(重置功能每帧运行)上显示出很高的百分比。 的程序是这样的:vector :: clear()花费那么多时间?

INIT部分:

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

VecOfVecOfPath是一系列路径的其他功能找到。 VecOfVecOfPath [i]将在每帧执行期间填充。 例如它由其他功能执行,并在每帧使用之前复位。

复位功能:

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

所以重置很简单,但它确实有一个分析器相当高的排名。

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

谢谢!


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

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

所以它就像@ noggin182建议的一样,在调试和发布模式下情况有所不同。

引用:“Meke确保在发布版本的分析和搜索,看看是否有任何预处理条件定义设置以提高性能 - noggin182 1月3日在15:32。”

+0

你认为你是不必要地调用'clear'吗? – 2012-01-03 14:51:42

+0

@parapurarajkumar - 我的第一件事也发生在我身上。我想我们需要更多关于'VecOfVec'的使用细节 - 也许Vecs可以回收以避免明显。 – 2012-01-03 14:56:57

+4

向量的矢量是什么? – 2012-01-03 14:57:06

回答

1

这要看是什么在你的向量中,如果你的嵌套向量包含类,那么你将调用嵌套向量中每个实例的矩阵。我很确定它也将释放内存。

这听起来像你正在写一个游戏?如果是这样的话,我在游戏写作中阅读过的几本书(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]); 

这是对尽可能多的帮助,因为我可以提供没有任何更多的信息

+0

它是int类型的,所以我认为它不需要太多时间来清除()它。我认为本地数组是否与向量相同,如果我正确地保留()为它?然后矢量不会重新分配,所以速度很快。 – 2012-01-03 15:14:19

+0

好吧,如果它是一个int向量,那么我会认为这应该不会那么慢。你使用什么编译器?我没有看到vector的所有实现,但我很惊讶他们在MSVC,Borland和GCC之间有多么不同。它们都具有开关,以启用某些理智和调试检查,并执行范围检查和屏蔽等任务,确保您只在容器上使用迭代器。确定你正在分析发布版本和搜索,看看是否有任何预先设定的条件定义来提高性能。 – noggin182 2012-01-03 15:32:32

+0

我正在使用VS2010专业版。我会在今天晚些时候尝试发布版本并报告结果,谢谢! – 2012-01-04 00:24:41