从缓存友好的角度分析数组和链表

上次被T4专家暴虐,希望我从Cache Friendly分析顺序遍历数组和链表,回来看了一下操作系统书大概了解了一点大佬说的Cache Friendly,说的不对或有补充的巨巨请留言哈。

首先要知道高速缓存是怎么工作的,他是为了解决CPU计算和内存读取速度不匹配的问题,使用多级缓存,把经常使用的数据放在高速缓存,一级缓存的速度接近寄存器,但是价格昂贵容量小。数据以块为单位调入缓存,原理主要是局部性原理,即当前使用了某个数据,则其附近的数据也很可能在接下来被访问,所以把当前数据附近的数据按照块调入高速缓存,如果某一块不在高速缓存,则需要执行额外的操作从内存读取块到高速缓存。说到这里也许你有点感觉了。数组在物理内存中是连续的,假设现在高速缓存内没有任何块,遍历一个数组可能只需要一次操作把块调入高速缓存,如果是链表,他在物理内存中可能放在很多不同的块中(所谓的数据零散化吧),需要多次调入块或者置换某些块,这个操作的时间消耗对于CPU来说是非常长的,人家可是数着纳秒过日子的。可以说,对比数组,链表减低了局部性。

扩展:其他减低局部性的操作

1、多线程可能导致指令流的分散和内存访问的突然变化。(写帧同步计时器已踩过多线程的坑)

2、面向对象鼓励使用小程序和数据模块,关于他们的引用在短时间内可能分散在相对比较多的对象内。

大概就这些了,欢迎补充。

猜你喜欢

转载自blog.csdn.net/qq_30858573/article/details/79638431