大规模数据对 vector 和 map 的压力

平时的机器上跑个小程序,几百条数据,基本不会发现容器之间的差别。这也可能是许多人不去关心容器底层的原因。

这篇文章是我拿到一个简历,上面写到精通STL,遂想出这个问题,让其来分析一下。(每次面试问过的我都公开,不问重复的 ^D)

如果我们有超过十亿个用户自定义的对象 People,每个对象大小暂定12字节,那么分别用 vector 和map存储,在查找上性能有什么差别。

C++标准规定 vector是连续的序列容器,这就是说在容器中相邻的数据,在物理内存中也相邻。map的底层是RBTree,容器内相邻的元素在物理内存中不一定相邻。由于map采用树的结构,所以每个节点除了数据占有的内存之外,还要left,right,parent 指针,每个指针4Bytes。

不包括容器本身占的空间,通常一页内存为4KB,那么如果用vecotr存储的话,一页可以放341个对象,如果用map的话,一页内存可以放171个,相差近 2 倍,所以用map存储的话,在查找的时候,更容易产生内存缺页,而且是频繁的缺页,这样map就会因为大规模的数据而性能严重下降。

此外,由于map的节点很可能分布在内存的各个角落,容器内相邻可是物理不相邻更容易产生内存缺页中断,这种情况恐怕更糟糕!

当然vector也有其不可避免的缺点:

在存储的过程中,他会不断的内存扩张,复制数据的过程也是蛮昂贵的说(即使我们可以用很大的初始容量来尽量减少内存扩张的次数)。此外为了能用binary_search,需要vector有序,这个时间也不容忽视,绝不忽视。

但是当一切尘埃落定,我们大部分操作都在查找的时候,性能的差距就会不言自明了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值