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(…)
write
x+=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();
}