我有一个由其他人编写的函数,我已经确定在完全执行函数块中的每个语句之后,有时需要花费很长时间才能退出函数。如果我没记错的话,在这段时间内发生的唯一事情就是调用堆栈(本地)对象上的所有析构函数,然后在移动堆栈指针时函数返回。我想发布这个功能,但它有点复杂,是别人的知识产权。但是,只在堆栈上声明标准STL容器。容器是
set<unsigned int>
unordered_map<unsigned_int, vector<unsigned int>>
vector<pair<set<unsigned int>,set<unsigned int> > >
vector<pair<set<unsigned int>,int> >
set<unsigned int>
several unsigned ints
unordered_map<unsigned int, unordered_map<unsigned int, bool> >
set<unsigned int>
set<unsigned int>
有谁知道为什么会这样?我认为时间可能会被本地声明的STL对象上的析构函数调用所消耗。有没有人见过这种事发生过?在其他任何地方我都应该看看?
答案 0 :(得分:2)
如果没有实际发布源代码,我意识到这个答案可能有点模糊或轶事。但我会赞美vu1p3n0x的有用建议,这使我了解时间的消耗。它实际上是这个数据结构的析构函数:
unordered_map<unsigned int, unordered_map<unsigned int, bool> > somemap;
在某些情况下调用somemap.clear()会花费很长时间。我观察到它的病例超过5分钟。所以我想这里的教训是在嵌套可能变大的unordered_maps时要小心。
编辑:代码在发布模式下运行得更快。上述数据结构仍然相对较慢,但在发布模式与调试模式相比,速度要慢得多。
我后来发现这个话题对于碰巧遇到这个问题的人来说更有帮助: