在以下代码中,我实现并填充了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";
}
答案 0 :(得分:0)
我最好的猜测是堆变得复杂,并且在释放节点时unuseful()方法的退出时,堆被分段,它们是第一个malloc引发堆同步化。有一个原因,我不明白它是不是1000堆的malloc没有清理... 如果保留节点映射,它的行为方式是否相同?
另一个想法:如果你删除了unuseful()调用该怎么办?编译器是否初始化'start并在unuseful()之前调用getTimeMilliseconds?