CSDN博客

img fisher_jiang

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

发表于2008/9/30 11:49:00  1145人阅读

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

这篇文章是我拿到一个简历,上面写到精通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 0

相关博文

我的热门文章

img
取 消
img