Qt - std::unordered_map - 析构时间

3
我有一个类,其中包括一个单例和一个成员std::unordered_map,其键为unsigned int,值为一个结构体。

问题出现在向其中添加大量元素时。
在VS中,此任务需要约2秒。 在QT中,它需要长达15秒。

销毁容器的元素(程序结束或单例类析构函数中)在VS中甚至不到半秒钟。 在QT中,此任务需要数分钟。

如果有人知道问题所在,请留下回答或评论。

注意:可以在运行时调用函数Fill几次。 如果必须等待几分钟才能清除容器...大多数时间似乎花费在_Iterator_base12::_Orphan_me内部。

以下是可重现代码(不含主函数):

#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()

主函数只需要一行代码。

1
你是在指Qt Creator吗?你是在使用MSVC编译器与Qt Creator一起使用,还是使用其他编译器? - Marko Popovic
@MarkoPopovic 是的,我正在使用带有Qt Creator的MSVC。 - Blacktempel
如果使用发布配置构建,是否会发生相同的情况? - Marko Popovic
1个回答

2

在花费更多时间查阅了一些谷歌和网站后,我找到了这个解决方案,使我在编译调试模式时不再出现问题。(发布模式正常)

我已将此方案添加到Qt Creator的.pro文件中。

DEFINES += _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
DEFINES += _HAS_ITERATOR_DEBUGGING=0

注意:在调试模式下可以稍微提高性能,但不适合用于安全检查。对我来说还好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接