C ++程序在函数返回上需要很长时间

时间:2016-05-13 03:15:27

标签: c++ performance stl destructor

我有一个由其他人编写的函数,我已经确定在完全执行函数块中的每个语句之后,有时需要花费很长时间才能退出函数。如果我没记错的话,在这段时间内发生的唯一事情就是调用堆栈(本地)对象上的所有析构函数,然后在移动堆栈指针时函数返回。我想发布这个功能,但它有点复杂,是别人的知识产权。但是,只在堆栈上声明标准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对象上的析构函数调用所消耗。有没有人见过这种事发生过?在其他任何地方我都应该看看?

1 个答案:

答案 0 :(得分:2)

如果没有实际发布源代码,我意识到这个答案可能有点模糊或轶事。但我会赞美vu1p3n0x的有用建议,这使我了解时间的消耗。它实际上是这个数据结构的析构函数:

unordered_map<unsigned int, unordered_map<unsigned int, bool> > somemap;

在某些情况下调用somemap.clear()会花费很长时间。我观察到它的病例超过5分钟。所以我想这里的教训是在嵌套可能变大的unordered_maps时要小心。

编辑:代码在发布模式下运行得更快。上述数据结构仍然相对较慢,但在发布模式与调试模式相比,速度要慢得多。

我后来发现这个话题对于碰巧遇到这个问题的人来说更有帮助:

Weird behaviour of C++ destructors