在我的程序中观察到一些性能问题后,我决定运行一个分析 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/