【问题标题】:C++ program takes a very long time on function returnC++程序在函数返回上花费了很长时间
【发布时间】:2016-05-13 03:15:27
【问题描述】:

我有一个由其他人编写的函数,我确定在函数块中的每个语句完全执行后,有时可能需要很长时间才能退出该函数。如果我没记错的话,在此期间唯一发生的事情是调用堆栈(本地)对象上的所有析构函数,然后函数在堆栈指针移动时返回。我想发布这个功能,但它有点复杂,而且是别人的知识产权。但是,只有标准 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 对象的析构函数调用所消耗。以前有人见过这种情况吗?我还应该去哪里看看?

【问题讨论】:

  • 容器中有多少数据?
  • ints 的销毁是微不足道的,vectors 只需进行一次释放。但是,sets 通常使用 N 个节点来保存数据,因此需要进行 N 次重新分配,这在放在一起时可能会非常昂贵。 (在这方面无法评论unordered_map
  • 您可以通过.clear()ing 最后的所有结构和计时来测试它是否是析构函数
  • @immibis,我不确定/尚未检查,但可能很多。但是在析构函数调用之前执行该函数并不需要太多时间。为什么销毁对象比在对象中插入数据要花费更多的时间?
  • @vu1p3n0x,这是个好主意……我会试试的。

标签: c++ performance stl destructor


【解决方案1】:

没有实际发布源代码,我意识到这个答案可能有点含糊或传闻。但是我要感谢 vu1p3n0x 的有用建议,它让我了解了时间消耗在哪里。它实际上是这个数据结构的析构函数:

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

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

编辑:代码在发布模式下运行得更快。还是上面的数据结构比较慢,但是release模式比debug模式慢很多。

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

Weird behaviour of C++ destructors

【讨论】:

  • 您对自己的发现有多大把握?我无法想象花费很少时间创建的地图会花费更长的时间来破坏......
  • @Vlad Feinstein,你可能是对的,我在上面编辑了我的帖子。
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多