Qt - std::unordered_map - 销毁时间
Qt - std::unordered_map - destruction time
我有一个 class 和一个成员 std::unordered_map
有一个 unsigned int
作为键 和 作为值的结构。
当向其中添加大量 元素时出现问题。
在 VS 中,此任务大约需要 2 秒。 在 QT 中,它最多需要 15秒.
容器元素的销毁(程序结束或单例的析构函数class)花费VS甚至不到半秒。 在 QT 中,此任务需要 几分钟。
如果有人知道问题出在哪里,请留下答案或评论。
注:函数Fill
可以在运行时间内调用几次。如果您必须等待几分钟才能清除一个容器,那就不太好了……大多数时候,它似乎都在 _Iterator_base12::_Orphan_me
内度过
此处 class/code 重现(无 main):
#include <unordered_map>
int RandomNumber(int min, int max)
{
return (rand() % ((max + 1) - (min))) + (min);
}
#define MAX_OTHER_DATA 5
struct OtherData
{
int Charges;
};
struct DataHolder
{
unsigned int ID;
std::string Name; //std::string / QString
int MaxCount;
int Stack;
unsigned int Duration;
OtherData other[MAX_OTHER_DATA];
unsigned int MaxDur;
};
class Worker
{
protected:
Worker() {}
public:
~Worker(void)
{
v.clear();
}
static Worker &instance(void)
{
static Worker work;
return work;
}
void Fill()
{
v.clear();
const std::size_t size = 38618; //current size - data fetched from a database
for (unsigned int i = 0U; i < size; ++i)
{
DataHolder it;
it.ID = RandomNumber(1, 60000);
it.Name = ""; //Usually populated
it.MaxCount = RandomNumber(0, 10);
it.Stack = RandomNumber(1, 10000);
it.Duration = RandomNumber(30, 250);
it.MaxDur = RandomNumber(0, 200);
v.insert(std::make_pair(i, it));
}
}
private:
std::unordered_map<unsigned int, DataHolder> v;
};
#define sWorker Worker::instance()
main函数只需要一行sWorker.Fill();
.
所以在投入更多时间到 Google 和一些网站后,我发现了这个,它解决了我在调试模式下编译时的问题。 (发布就好了)
我已将其添加到 Qt creator 中的 .pro
文件中。
DEFINES += _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
DEFINES += _HAS_ITERATOR_DEBUGGING=0
注意:对调试模式下的一点性能有好处,对安全检查不利。对我来说还好。
我有一个 class 和一个成员 std::unordered_map
有一个 unsigned int
作为键 和 作为值的结构。
当向其中添加大量 元素时出现问题。
在 VS 中,此任务大约需要 2 秒。 在 QT 中,它最多需要 15秒.
容器元素的销毁(程序结束或单例的析构函数class)花费VS甚至不到半秒。 在 QT 中,此任务需要 几分钟。
如果有人知道问题出在哪里,请留下答案或评论。
注:函数Fill
可以在运行时间内调用几次。如果您必须等待几分钟才能清除一个容器,那就不太好了……大多数时候,它似乎都在 _Iterator_base12::_Orphan_me
此处 class/code 重现(无 main):
#include <unordered_map>
int RandomNumber(int min, int max)
{
return (rand() % ((max + 1) - (min))) + (min);
}
#define MAX_OTHER_DATA 5
struct OtherData
{
int Charges;
};
struct DataHolder
{
unsigned int ID;
std::string Name; //std::string / QString
int MaxCount;
int Stack;
unsigned int Duration;
OtherData other[MAX_OTHER_DATA];
unsigned int MaxDur;
};
class Worker
{
protected:
Worker() {}
public:
~Worker(void)
{
v.clear();
}
static Worker &instance(void)
{
static Worker work;
return work;
}
void Fill()
{
v.clear();
const std::size_t size = 38618; //current size - data fetched from a database
for (unsigned int i = 0U; i < size; ++i)
{
DataHolder it;
it.ID = RandomNumber(1, 60000);
it.Name = ""; //Usually populated
it.MaxCount = RandomNumber(0, 10);
it.Stack = RandomNumber(1, 10000);
it.Duration = RandomNumber(30, 250);
it.MaxDur = RandomNumber(0, 200);
v.insert(std::make_pair(i, it));
}
}
private:
std::unordered_map<unsigned int, DataHolder> v;
};
#define sWorker Worker::instance()
main函数只需要一行sWorker.Fill();
.
所以在投入更多时间到 Google 和一些网站后,我发现了这个,它解决了我在调试模式下编译时的问题。 (发布就好了)
我已将其添加到 Qt creator 中的 .pro
文件中。
DEFINES += _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
DEFINES += _HAS_ITERATOR_DEBUGGING=0
注意:对调试模式下的一点性能有好处,对安全检查不利。对我来说还好。