c++ - 分析和性能问题

标签 c++ profiling

在我的程序中观察到一些性能问题后,我决定运行一个分析 session 。结果似乎表明,大约 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*> .平均而言,当列表平均包含 5 个项目时,我每秒调用此函数 30 到 60 次。这意味着我要删除 150 到 300 之间的任意位置 A每秒对象数。

在大多数情况下,多次调用 delete 是否足以导致性能问题?有没有什么办法可以准确地找到函数中发生问题的位置?删除通常被认为是一项昂贵的操作吗?

最佳答案

很难说清楚,因为您忽略了循环中可能完成的大部分工作并且没有给出 A 是什么的提示...

如果 A 是一个简单的数据集合,尤其是原始数据,那么删除几乎肯定不是罪魁祸首。您可以通过将更新函数一分为二来测试理论 - update 和 uninit。 Update 完成所有处理,uninit 删除对象并清除列表。

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

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

关于c++ - 分析和性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867548/

相关文章:

c++ - 编织内联类型转换(python)

c++ - 如何识别 Windows 静态库中的导出函数?

windows - 我可以使用哪些工具来确定我的应用程序的硬件要求?

python - 这个 cProfile 结果告诉我我需要修复什么?

java - 如何获取java中堆上所有对象单独消耗的运行时内存

assembly - 如何定义一个用户定义的事件来被 PAPI 衡量?

profiling - Xdebug中 "<Cycle 1>"表示什么?

c++ - 我可以在 Windows Xp Pro SP3 系统上配置漫游用户配置文件吗?

c++ - OpenGL C++ Plain Subdivison in QUADS (Radiosity) patches on arrays

c++ - AVG 防病毒软件禁用了网络摄像头