如何解决如果内容被删除,std::map 会非常慢
我发现了一种奇怪的行为,但我不知道为什么会这样。看看这里的代码:
std::map<size_t,std::vector<Resource*>> bla;
for(int i = 0; i<100000; i++) {
std::vector<Resource*> blup;
blup.push_back(new Resource());
bla[i] = blup;
}
for (auto& resources : bla) {
for (auto resource : resources.second) {
delete resource; // <---- this delete here
}
resources.second.clear();
}
bla.clear(); // <---- this clear here
如果我在 eclipse-debugger 中运行这个程序,最后一行的 clear() 需要几秒钟(我认为太长了)。对于更大的地图(> 10M 元素),它需要长达几分钟(!)。
但是如果我在内部循环中注释掉 delete 语句,那么 clear() 函数会变得非常快(和我预期的一样快)。
没有调试器,代码在两种情况下都很快(删除和不删除)。
“Resource”类是一个小容器类,包含 2 个 uint64_t 和一个 std::string(当然还有一些方法)。
为什么 clear() 很慢?如果我不删除指针,为什么它会加速。我不明白,因为我什至清除了地图中的矢量。所以映射应该看不到任何指针,它是 uint64_t 和 std::vectors 之间的映射。
我将 MinGw_64 用于 Windows(msys64、msys2-x86_64-20210419)和 Eclipse。
现在我已经切换到没有矢量的仅地图。一切都很好。即使我删除指针,Clear 也非常快。但是如果没有向量,我必须稍微考虑一下我的算法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。