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,使用地图的延迟消失了!我不确定这是如何相关的,但华友世纪!
如果映射变得非常大,则可能会出现内存管理问题,并且fillFromBinaryData
需要一些内存分配,但现在速度较慢。可能是由于内存碎片?
我建议尝试一些用于此特定目的的库。不过,我忘了他们怎么称呼了。我只知道谷歌提供了一个“jemalloc”或类似的东西。
自定义内存池的要点是,您可以将内存作为一大堆分配一次,并且仅在具有自定义分配器的应用程序范围内使用它。
另一件事可能是停止使用地图并使用无序地图。使用完美的哈希函数将插入的时间复杂度从 O(logn) 更改为 O(1),因为对您来说,是一个电话号码。