填充unordered_map后的malloc经过的时间(c ++)

时间:2014-02-26 14:41:03

标签: c++ performance malloc unordered-map

在以下代码中,我实现并填充了unordered_map(函数unuseful()),然后我使用malloc来分配内存。 malloc调用所用的时间非常长(或多或少135毫秒来存储1001个字节):为什么?

我正在使用在Lubuntu 13.10上运行的gcc4.8.1进行编译。编译命令为g++ -std=c++11 main.cpp(如果我添加-O1-O2-O3-Ofast-Wno-write-strings等优化,结果不会更改)。我正在测试一个(更复杂的)程序的效率,我真的需要了解哪些部分花了多少时间。

如果我删除函数unuseful()或将代码从函数unuseful()移动到main函数,则时间变为0.如果我分配1000个字节而不是1001,则时间变为0。我使用for循环重复两次实验,第一次实验的时间再次是135毫秒,第二次实验的时间是0。

代码如下。

#include <iostream>
#include <unordered_map>
#include <sys/time.h>
#include <unistd.h>

using namespace std;

void unuseful() {
    unordered_map <string, int> nodes;
    for (int nn = 0; nn < 1000000; nn++) {
        nodes[to_string(nn)] = nn;
    }
}

long getTimeMilliseconds() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_usec / 1000 + tv.tv_sec * 1000;
}

int main() {
    unuseful();

    long start = getTimeMilliseconds();
    int *dist = (int*) malloc(1001);
    cout << "Time: " << getTimeMilliseconds() - start << "\n";
    cout << "Something unuseful to avoid compiler optimizations: " << dist[1000] << "\n";
}

1 个答案:

答案 0 :(得分:0)

我最好的猜测是堆变得复杂,并且在释放节点时unuseful()方法的退出时,堆被分段,它们是第一个malloc引发堆同步化。有一个原因,我不明白它是不是1000堆的malloc没有清理... 如果保留节点映射,它的行为方式是否相同?

另一个想法:如果你删除了unuseful()调用该怎么办?编译器是否初始化'start并在unuseful()之前调用getTimeMilliseconds?