最近项目中使用到stl unordermap,当map存储的key数量上升到10的6次-7次甚至8次以上时,unordermap的insert接口性能有严重瓶颈
下面是测试代码:
int main() {
std::unordered_map<int, int> t;
for (int i = 0; i <= 10000000; ++i) {
t.insert(make_pair(i, 1));
}
}
以上 运行时间
real 0m5.231s
user 0m4.888s
sys 0m0.331s
原因是随着插入元素增多,insert过程中发生了碰撞,碰撞开链到一定的阈值,触发了增加bucket,进而触发了rehash,打印bucket_size可以看到bucketsize一直在增加,代价非常大
unorderedmap提供了reserve和rehash两个接口
reserve可以用来预留元素个数,rehash根据提供的元素个数预留足够的bucket数目
修改后代码
int main() {
std::unordered_map<int, int> t;
t.reserve(10000000);
t.rehash(10000000);
for (int i = 0; i <= 10000000; ++i) {
t.insert(make_pair(i, 1));
}
}
运行