在观察到程序中的一些性能问题后,我决定运行性能分析会话。结果似乎表明,大约87%的样本与我的Update()
函数有关。
在此函数中,我将遍历一个A*
列表,其中sizeof(A)
等于72,并在处理后将其删除。
void Update()
{
//...
for(auto i = myList.begin(); i != myList.end(); i++)
{
A* pA = *i;
//Process item before deleting it.
delete pA;
}
myList.clear();
//...
}
其中myList是一个std::list<A*>
。平均每秒我会调用这个函数30到60次,而列表平均包含5个条目。这意味着我每秒要删除150到300个A
对象。
在大多数情况下,多次调用delete是否足以导致性能问题?有没有办法准确地追踪到问题发生在函数的什么地方?delete通常被认为是一项昂贵的操作吗?
发布于 2012-12-14 05:00:16
很难判断,因为你在循环中可能完成了大部分工作,并且没有给出A是什么的提示……
如果A是一个简单的数据集合,特别是原语,那么删除几乎肯定不是罪魁祸首。
如果只有更新速度慢,那就是处理慢了。如果只是uninit很慢,那么就是删除。如果两者都很慢,那么内存碎片可能是罪魁祸首。
正如其他人在评论中指出的那样,std::vector可能会给您带来性能提升。但要小心,因为它也可能在其他地方导致性能问题,这取决于您如何构建数据结构。
发布于 2012-12-14 06:57:47
你可以看看来自gperftools (谷歌性能工具)的tcmalloc。profiler可用于cpu和堆分析。
发布于 2012-12-14 07:08:48
很容易看出发生了什么事。
帮你自己一个忙,使用。它已经被分析到了第n级,并且非常有效。
简而言之,如果87%的时间是在Update
中,那么如果您只是使用Ctrl-C或其他方法停止它几次,那么每次您在操作中捕获它的概率是87%。
您不仅会看到它是在Update
中。您将看到它在Update
中的位置,以及它在做什么。如果它正在进行delete
,或者访问数据结构,你会看到这一点。在堆栈的下面,您还将看到该操作耗时的原因。
https://stackoverflow.com/questions/13867548
复制相似问题