地图性能问题

Sil*_*cer 5 c++ performance dictionary

如果有人可以帮助我,我完全没有想法.

所以我有这个代码(这是我的代码的一个非常简化的版本):

while(readNewFile())
{
    while(getNewStructFromFile())
    {
        unsigned long starttime = GetTickCount();
        customerData.fillFromBinaryData(structPointer);
        cout<< GetTickCount() - starttime;

        aMap.insert(pair<int,string>(customerData.phoneNumber,""));
    }

    // Ouptut all data

    aMap.clear();
}
Run Code Online (Sandbox Code Playgroud)

基本上,它只是从二进制文件中读取记录.customerData得到数据并用来自它的数据填充变量.然后,它将电话号码插入到地图中(为了调试我实际上只是插入一个int和一个空字符串).

问题是,一段时间后这个程序变得很慢; 如果我注释掉地图插入程序运行正常没有问题,每个文件的执行时间是恒定的.如果我使用地图插入,在几个文件之后,程序再次变得非常慢(从8-10秒到1分钟或更长).但调试时GetTickCount(),它告诉我延迟发生在customerData.fillFromBinaryData(最初0ms,然后它跳到30-40毫秒(填写类变量)).但是,如果我评论这个简单的地图插入,用数据填充对象没有延迟!那逻辑在哪里?有人可以给我一个提示,我是出于想法.对不起,如果这个问题不是很好的话.

我尝试了不同类型的地图,但同样,它告诉我延迟不在地图插入中.

编辑/可能解决方案:

如果有人有类似的问题,我安装了VS2015,使用地图的延迟消失了!我不确定这是如何相关的,但华友世纪!

Ale*_*heo 1

如果映射变得非常大,则可能会出现内存管理问题,并且fillFromBinaryData需要一些内存分配,但现在速度较慢。可能是由于内存碎片?

我建议尝试一些用于此特定目的的库。不过,我忘了他们怎么称呼了。我只知道谷歌提供了一个“jemalloc”或类似的东西。

自定义内存池的要点是,您可以将内存作为一大堆分配一次,并且仅在具有自定义分配器的应用程序范围内使用它。

另一件事可能是停止使用地图并使用无序地图。使用完美的哈希函数将插入的时间复杂度从 O(logn) 更改为 O(1),因为对您来说,是一个电话号码。

  • 它被称为 jemalloc,它不是来自 Google。:)

  • 那么这可能是一个碎片问题。检查 jemalloc 做了什么。不然我不知道会是什么。我建议然后使用 valgrind --tool=callgrind 或类似的东西运行您的应用程序。 (2认同)