地图性能问题

时间:2015-08-10 06:23:38

标签: c++ performance dictionary

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

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

hover

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

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

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

编辑/可能的解决方案:

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

1 个答案:

答案 0 :(得分:1)

可能会发生这样的情况,即如果地图变得非常大,则存在内存管理问题,fillFromBinaryData需要一些内存分配,现在速度较慢。由于内存碎片可能?

我建议为这个特定目的尝试一些库。但是,我忘记了它们的名称。我只知道有一个来自谷歌,“jemalloc”或类似的东西。

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

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

  • 它叫做jemalloc而不是Google。 :)