分析和性能问题

时间:2012-12-13 20:03:48

标签: c++ profiling

在我的程序中观察到一些性能问题后,我决定运行一个性能分析会话。结果似乎表明,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会导致性能问题吗?有没有办法准确追踪问题发生在哪个功能?删除通常被认为是一项昂贵的操作吗?

3 个答案:

答案 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的过程中,或者访问数据结构,您将看到它。您还将在堆栈中看到该操作需要时间的原因。