C++ 地图性能问题
如果有人能帮我,我完全没有主意了 所以我有这个代码(这是我代码的一个非常简化的版本):C++ 地图性能问题,c++,performance,dictionary,C++,Performance,Dictionary,如果有人能帮我,我完全没有主意了 所以我有这个代码(这是我代码的一个非常简化的版本): while(readNewFile()) { while(getNewStructFromFile()) { 无符号长starttime=GetTickCount(); customerData.fillFromBinaryData(structPointer); 可能会发生这样的情况,如果一个映射变得非常大,那么内存管理就会出现问题,fillFromBinaryData需要一些内存分配,而现在速度较慢。可能
while(readNewFile())
{
while(getNewStructFromFile())
{
无符号长starttime=GetTickCount();
customerData.fillFromBinaryData(structPointer);
可能会发生这样的情况,如果一个映射变得非常大,那么内存管理就会出现问题,fillFromBinaryData
需要一些内存分配,而现在速度较慢。可能是因为内存碎片
我建议尝试使用一些专门的库。但是,我忘记了它们的名称。我只知道谷歌有一个“jemalloc”或类似的名称
自定义内存池的要点是,您可以一次性分配大量内存,并且只能在应用程序的某个范围内使用自定义分配器
还有一件事可能是停止使用映射,而使用无序映射。使用完美的哈希函数将插入的时间复杂度从O(logn)更改为O(1),因为对您来说,是一个电话号码
- 它叫jemalloc,不是来自谷歌
您正在打印每个循环中的所有数据?数据每次都会变得更大……考虑到问题正文中完全没有提及这一点,我根本不是唯一一个对这个问题被标记为asn.1
感到好奇的人。customerData是什么(phoneNumber是属性还是仅仅是int?)fillFromBinaryData做什么?试着做些别的事情,只是“使用”电话号码。例如,将变量x
初始化为零,而不是map.insert(…)
writex+=customerData.phoneNumber
。它会影响程序的性能吗?如果它确实会影响性能,那么问题确实出在fillFromBinaryData
方法中,当您不插入映射时,编译器优化会启动。如果它不会影响性能,那么我们应该查看为什么映射工作缓慢。为什么不使用探查器来查找性能瓶颈?它告诉您调用函数的次数以及子函数调用函数所花费的时间。映射的前几个文件正常,如何解释?我调用clear()在每个文件之后,映射应该从0开始,它不是还在增长吗?我使用无序映射并保留4000个元素,一个文件大约有3500条记录。那么这可能是一个碎片问题。检查jemalloc做了什么。否则我不知道它可能是什么。我建议然后使用valgrind--tool=callgrind或类似的东西。
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();
}