首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >性能分析和性能问题

性能分析和性能问题
EN

Stack Overflow用户
提问于 2012-12-14 04:03:48
回答 3查看 86关注 0票数 0

在观察到程序中的一些性能问题后,我决定运行性能分析会话。结果似乎表明,大约87%的样本与我的Update()函数有关。

在此函数中,我将遍历一个A*列表,其中sizeof(A)等于72,并在处理后将其删除。

代码语言:javascript
运行
复制
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通常被认为是一项昂贵的操作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-14 05:00:16

很难判断,因为你在循环中可能完成了大部分工作,并且没有给出A是什么的提示……

如果A是一个简单的数据集合,特别是原语,那么删除几乎肯定不是罪魁祸首。

如果只有更新速度慢,那就是处理慢了。如果只是uninit很慢,那么就是删除。如果两者都很慢,那么内存碎片可能是罪魁祸首。

正如其他人在评论中指出的那样,std::vector可能会给您带来性能提升。但要小心,因为它也可能在其他地方导致性能问题,这取决于您如何构建数据结构。

票数 1
EN

Stack Overflow用户

发布于 2012-12-14 06:57:47

你可以看看来自gperftools (谷歌性能工具)的tcmalloc。profiler可用于cpu和堆分析。

票数 0
EN

Stack Overflow用户

发布于 2012-12-14 07:08:48

很容易看出发生了什么事。

帮你自己一个忙,使用。它已经被分析到了第n级,并且非常有效。

简而言之,如果87%的时间是在Update中,那么如果您只是使用Ctrl-C或其他方法停止它几次,那么每次您在操作中捕获它的概率是87%。

您不仅会看到它是在Update中。您将看到它在Update中的位置,以及它在做什么。如果它正在进行delete,或者访问数据结构,你会看到这一点。在堆栈的下面,您还将看到该操作耗时的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13867548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档