开发者社区> 问答> 正文

为什么缓存局部性对阵列性能至关重要?

在以下博客中,有一个关于数组相对于链表的优势的声明:

阵列具有更好的缓存局部性,可以在性能上产生很大的不同。

这意味着什么?我不了解缓存局部性如何提供巨大的性能优势。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:51:49 463 0
1 条回答
写回答
取消 提交回答
  • 请参阅我关于时空局部性的答案。

    特别是,数组是连续的内存块,因此它们的大块将在首次访问时加载到高速缓存中。这使得访问数组的将来元素相对较快。另一方面,链接列表不一定位于连续的内存块中,并且可能导致更多的高速缓存未命中,从而增加了访问它们的时间。

    考虑以下数组的可能的内存布局data以及l_data大型结构的链接列表

    Address Contents | Address Contents ffff 0000 data[0] | ffff 1000 l_data ffff 0040 data[1] | .... ffff 0080 data[2] | ffff 3460 l_data->next ffff 00c0 data[3] | .... ffff 0100 data[4] | ffff 8dc0 l_data->next->next | ffff 8e00 l_data->next->next->next | .... | ffff 8f00 l_data->next->next->next->next 如果我们要遍历该数组,则第一次访问ffff 0000将需要我们进入内存进行检索(CPU周期中非常慢的操作)。但是,在第一次访问之后,阵列的其余部分将位于缓存中,随后的访问将更快。有了链表,第一次访问也ffff 1000将需要我们去记忆。不幸的是,处理器将直接缓存该位置周围的内存,一直到为止ffff 2000。如您所见,这实际上并没有捕获列表中的任何其他元素,这意味着当我们访问时l_data->next,我们将不得不再次进入内存。

    2020-02-09 13:52:01
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载