Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从局部性角度看数组与链表_Arrays_Caching_Data Structures_Linked List_Localityofreference - Fatal编程技术网

Arrays 从局部性角度看数组与链表

Arrays 从局部性角度看数组与链表,arrays,caching,data-structures,linked-list,localityofreference,Arrays,Caching,Data Structures,Linked List,Localityofreference,假设我们有一个未排序的数组和链表。 搜索两种数据结构的元素时,最坏的情况是O(n),但我的问题是: 由于在缓存中使用了空间局部性,数组的速度还会快很多吗?还是缓存会利用分支局部性,使链表的速度与任何数组一样快 我对数组的理解是,如果访问一个元素,那么该内存块和周围的许多块就会被带到缓存中,从而允许更快的内存访问 我对链表的理解是,由于遍历链表的路径是可预测的,因此缓存将利用该路径并仍然存储适当的内存块,即使链表的节点可能在堆中相距很远。您对数组情况的理解基本正确。如果按顺序访问阵列,许多处理器不

假设我们有一个未排序的数组和链表。 搜索两种数据结构的元素时,最坏的情况是O(n),但我的问题是:

由于在缓存中使用了空间局部性,数组的速度还会快很多吗?还是缓存会利用分支局部性,使链表的速度与任何数组一样快

我对数组的理解是,如果访问一个元素,那么该内存块和周围的许多块就会被带到缓存中,从而允许更快的内存访问


我对链表的理解是,由于遍历链表的路径是可预测的,因此缓存将利用该路径并仍然存储适当的内存块,即使链表的节点可能在堆中相距很远。

您对数组情况的理解基本正确。如果按顺序访问阵列,许多处理器不仅会获取包含该元素的块,还会预取后续块,以最小化等待缓存未命中的周期。如果您使用的是英特尔x86处理器,您可以在“英特尔x86优化”中找到详细信息。此外,如果数组元素足够小,则加载包含元素的块意味着下一个元素可能位于同一块中

不幸的是,对于链表,从处理器的角度来看,加载模式是不可预测的。它不知道在地址X加载元素时,下一个地址是(X+8)的内容

作为一个具体的例子,顺序阵列访问的加载地址序列是好的和可预测的。 例如,1000、1016、1032、1064等

对于链接列表,它将如下所示:
1000、3048、5040、7888等。很难预测下一个地址。

您所说的“分支位置”是什么?缓存如何绕过主内存的延迟?请描述您认为缓存对链表节点的作用。@delnan您可以在这里阅读有关分支位置的信息:我不知道第二个问题的答案。在问题的最后,我解释了缓存对节点的作用。对分支局部性的描述似乎是关于一组固定的小备选方案,如分支指令的目标(因此得名)。相反,链表的下一个节点可能在任何地方。至于我的第二个问题:缓存修复的问题主要不是有限的带宽,而是有限的延迟。一次将一个大的连续块加载到缓存中(就像空间位置/阵列一样)是一种改进,因为缓存只需支付一次延迟成本。所以我的问题是,缓存如何在不支付n次延迟成本的情况下加载链表的n个节点?这至少与我的理解一致;-)此博客和页面可能与此相关