在我的程序中观察到一些性能问题后,我决定运行一个性能分析会话。结果似乎表明,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会导致性能问题吗?有没有办法准确追踪问题发生在哪个功能?删除通常被认为是一项昂贵的操作吗?
答案 0 :(得分:1)
很难说,因为你刷过了循环中可能完成的大部分工作,并没有提示A是什么......
如果A是一个简单的数据集合,特别是原始数据,那么删除几乎肯定不是罪魁祸首。您可以通过将更新函数分成两部分来测试理论 - 更新和取消。更新完成所有处理,uninit删除对象并清除列表。
如果只是更新很慢,那就是处理。如果只是uninit很慢,那么它就是删除。如果两者都很慢,那么内存碎片可能就是罪魁祸首。
正如其他人在评论中指出的那样,std :: vector可能会提高性能。但要小心,因为它可能还会导致其他地方出现性能问题,具体取决于您构建数据结构的方式。
答案 1 :(得分:0)
您可以查看tcmalloc(Google Performance Tools)中的gperftools。 gperftools还包含一个分析器(两个库只需要链接,非常容易)。 tcmalloc为小对象保留内存池,并在可能的情况下重新使用此内存。 分析器可用于cpu和堆分析。
答案 2 :(得分:0)
很容易分辨出发生了什么。
帮自己一个忙,并使用this method。 它已被分析到第n度,并且非常有效。
简而言之,如果87%的时间都在Update
,那么如果你只是用Ctrl-C或其他任何东西停止几次,那么你每次抓到它的可能性是87%。行为。
您不仅会看到它在Update
中。您会在Update
中看到 where ,以及正在做什么。如果它处于delete
的过程中,或者访问数据结构,您将看到它。您还将在堆栈中看到该操作需要时间的原因。