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

C++ C++;程序返回函数需要很长时间,c++,performance,stl,destructor,C++,Performance,Stl,Destructor,我有一个由其他人编写的函数,我已经确定,在完全执行函数块中的每个语句后,有时可能需要很长时间才能退出该函数。如果我没有记错的话,在这段时间内发生的唯一事情就是调用堆栈(本地)对象上的所有析构函数,然后在堆栈指针移动时函数返回。我想发布这个函数,但它有点复杂,而且是别人的知识产权。但是,堆栈上只声明标准STL容器。这些容器是 set<unsigned int> unordered_map<unsigned_int, vector<unsigned int>>

我有一个由其他人编写的函数,我已经确定,在完全执行函数块中的每个语句后,有时可能需要很长时间才能退出该函数。如果我没有记错的话,在这段时间内发生的唯一事情就是调用堆栈(本地)对象上的所有析构函数,然后在堆栈指针移动时函数返回。我想发布这个函数,但它有点复杂,而且是别人的知识产权。但是,堆栈上只声明标准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>
set
无序地图
矢量
矢量
设置
几个无符号整数
无序地图
设置
设置

有人知道为什么会这样吗?我认为时间可能会被本地声明的STL对象上的析构函数调用所消耗。以前有人见过这种情况吗?我应该去别的地方看看吗?

在没有实际发布源代码的情况下,我意识到这个答案可能有点含糊或轶事。但我要感谢vu1p3n0x提供的有用建议,它使我了解了时间消耗的位置。它实际上是此数据结构上的析构函数:

unordered_map<unsigned int, unordered_map<unsigned int, bool> > somemap;
无序映射somemap;
在某些情况下调用somemap.clear()需要很长时间。我观察到需要5分钟以上时间的病例。因此,我想这里的教训是在嵌套可能会变大的无序_图时要小心

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

我后来发现了这个话题,我认为这个话题对偶然发现这个问题的人更有帮助:


容器中有多少数据?对
int
s的销毁非常简单,
vector
s只有一次释放。但是,
set
s通常使用N个节点来保存数据,因此要进行N次释放,这在一起时可能会非常昂贵。(在这方面,不能评论
unordered\u map
)您可以通过
.clear()
在结束和计时时对所有结构进行排序来测试析构函数是否正确that@immibis,我不太确定/还没有检查,但可能很多。但是在析构函数调用之前执行函数并不需要太多时间。为什么销毁一个对象比在对象中插入数据花费的时间要多得多?@vu1p3n0x,这是个好主意……我试试。你对你的发现有多确定?我无法想象,创建一张只需很少时间的地图就需要花费更长的时间来销毁…@Vlad Feinstein,你可能是对的,我在上面编辑了我的帖子。