【发布时间】: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<int>::clear()应该等同于__end_ptr == __start_ptr或__size = 0,它们是数据成员。因此它应该非常快,你不应该注意到每帧调用它 20 次(好吧,与每帧将那些 20*640 元素放入向量中相比)。
标签: c++ performance vector