目录
链表:
优点:
缺点:
顺序表:
缺点:
优点:
链表:
优点:
1、任意位置插入删除O(1)
2、按需申请释放空间
缺点:
1、不支持下标随机访问
2、CPU高速缓存命中率会更低
内存非连续性:链表的节点通常不是在内存中连续存储的,每个节点可能分布在不同的内存地址上。这与CPU缓存的一级缓存(L1 Cache)和二级缓存(L2 Cache)的工作方式不匹配,这些缓存更喜欢处理连续内存块,因为它们采用缓存行(cache lines)的方式加载数据。当遍历链表时,由于节点的内存不连续,缓存行可能不断被刷新,导致缓存命中率降低。
缓存行失效:当CPU加载一个特定内存地址的数据时,它通常会加载整个缓存行,而不仅仅是单个数据项。链表节点之间的间隔较大,可能会导致多个节点散布在不同的缓存行中。当CPU访问一个链表节点,只有一个节点的数据被缓存,而其他节点可能因此而被缓存行失效。这会导致额外的内存访问开销,从而减低了缓存命中率。
缓存容量限制:CPU缓存有限的容量,如果链表过大,其中的节点数量超过了缓存能够容纳的范围,那么缓存的数据将会频繁被替换出去,导致更低的缓存命中率。这是因为缓存采用替换策略,最近使用的数据可能会被淘汰以给新的数据腾出空间。
顺序表:
缺点:
1、前面部分插入删除数据,效率是O(N),需要挪动数据。
2、空间不够,需要扩容。
a、扩容是需要付出代价的
b、一般还会伴随空间浪费。
优点:
1、尾插尾删效率不错。
2、下标的随机访问。
3、CPU高速缓存命中率会更高
内存连续性:顺序表中的元素是在内存中连续存储的,也就是它们在物理内存上的地址是相邻的。这与CPU缓存的工作方式非常匹配,因为缓存通常加载整个缓存行,连续存储的元素能够充分利用缓存行的性能,提高数据的加载效率,从而提高缓存命中率。
数据局部性:顺序表充分利用了数据局部性原理,当CPU访问一个元素时,通常会连续地访问相邻的元素。这符合缓存的预取机制,缓存会将可能需要的数据预取到缓存中,因为下一个元素通常在内存中也是相邻的,所以它们很可能也在缓存中。
缓存容量利用:由于顺序表的数据是紧凑排列的,它可以更好地利用CPU缓存的有限容量。这意味着更多的数据可以同时驻留在缓存中,减少了缓存替换的频率,提高了命中率。