C ++ - std :: set构造函数有时效率很低?

时间:2011-09-15 15:47:05

标签: c++

我正在尝试以下列方式构建一个集合:

    std::set<SomeType> mySet(aVector.begin(), aVector.end());

在大多数情况下,此生产线的性能非常高效。在10%的情况下,我遇到了运行时间太长的情况(在某些情况下超过600毫秒!)。为什么会发生这种情况?每次输入都非常相似(矢量大部分是排序的)。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我看到三种可能的可能性:

    你的结构的
  1. operator<没有实现strict weak ordering,这是std :: set正常工作所必需的。请记住,如果您的双倍值是NaN,那么您就是在打破这个假设(在其中一个需要很长时间才能查看是否存在NaN的集合中)。

  2. 有时您的数据不是很整齐。尝试总是首先对向量执行std :: sort,看看性能是否变平 - 默认构造集合然后使用带有两个参数的std :: set :: insert,第一个是要比较哪个元素的提示反对第一(如果你能提供一个好的提示)。这将让你无需求助即可构建集合。如果这样可以修复尖峰,那么您就知道数据的初始排序是原因。

  3. 您的堆分配器偶尔会执行一项操作,使其花费的时间比平时长得多。它可能是拆分或连接块,以便在需要更长时间的特定std :: set()调用上找到空闲内存。您可以尝试使用备用分配器(如果您的程序是多线程的,您可以尝试Google's tcmalloc)。如果你有一个分析器显示在分配器上花费的时间,你可以排除这种情况,但大多数都没有这个功能。另一个替代方案是to use a boost::intrusive_set,这样可以防止在将项目存储到集合中时进行分配。