【发布时间】:2019-04-15 04:01:15
【问题描述】:
在最近的项目中,使用了stl unordermap。当map中存储的key数量上升到6倍-7倍甚至8倍时,unordermap的insert接口的性能就出现了严重的瓶颈。随着插入元素数量的增加,在插入过程中会发生碰撞。碰撞打开到某个阈值,触发桶的增加,从而触发rehash。打印bucket_size可以看到bucketsize一直在增加,很贵。
这里是测试代码:
int main() {
std::unordered_map<int, int> t;
for (int i = 0; i <= 10000000; ++i) {
t.insert(make_pair(i, 1));
}
}
我应该使用保留元素的数量来提高性能吗?
t.reserve(10000000)
【问题讨论】:
-
std::unordered_map的性能取决于几个因素。大桶大小意味着哈希函数不是很好或最大负载因子非常高。你能发布你正在使用的key是什么,散列函数和max_load_factor是什么 -
你的问题和bad_alloc有什么关系?它在标题中,但你再也没有提到它。
-
您的问题是与性能瓶颈有关还是与插入元素时的 bad_alloc 有关?
-
@ZanLynx 我在多线程中操作unordered_map,不知道是不是这个原因,如果元素没有保留程序会bad_alloc
-
如果您从多个线程插入容器,那么您需要使用锁定。如果你不是,那将解释你得到的任何错误。