将阵列存储在缓存中

我正在审查一个面试问题,并与朋友比较笔记,关于CPU缓存,我们有一个不同的想法。

考虑大量数据,例如的大数组double,即:

double data[1024];

考虑使用动态分配的动态链表来存储相同数量的元素。该问题要求描述一些折衷方案:

  1. 这样可以加快随机访问的速度:我们都同意数组更快,因为您不必以线性方式遍历列表(O(n)),只需提供索引(O(1))即可。
  2. 比较两个相同长度的列表会更快一些:我们都决定,如果只是原始数据类型,则该数组将允许使用memcmp(),而链接列表则需要逐元素比较并取消引用开销。
  3. 如果您多次访问同一个元素,哪个允许更有效的缓存?

就这一点而言3,这是我们意见分歧的地方。我认为CPU将尝试缓存整个数组,并且如果数组过大,则无法将其存储在缓存中,因此不会有缓存的好处。使用链接列表,可以缓存单个元素。因此,当处理大量元素时,链表比静态数组更适合缓存“命中”。

问题是:两者中哪一个更适合缓存“命中”,现代系统是否可以缓存数组的一部分,或者它们是否需要整个数组,否则将无法尝试?我还可以使用对技术文档或标准的任何引用来提供明确的答案,这将大有帮助。

谢谢!

约翰·布林格

CPU不知道您的数据结构。它缓存或多或少的原始内存块。因此,如果您假设可以多次访问同一个元素而无需每次都遍历列表,那么链表和数组都不会比另一个具有缓存优势。

但是,与动态分配的链表相比,数组在顺序访问多个元素方面具有很大的优势。因为CPU高速缓存在大于1的内存块上运行double,所以当一个数组元素位于高速缓存中时,驻留在相邻地址中的其他几个数组元素也可能也在高速缓存中。因此,从主存储器读取一次(缓慢)可访问对多个相邻阵列元素的(快速)缓存访问。对于链表,情况并非如此,因为可以在内存中的任何位置分配节点,甚至单个节点也至少具有next指针的开销,以减少可以同时缓存的数据元素的数量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在内存缓存中存储大阵列(1 GB)

来自分类Dev

通过ID将项目存储在阵列中

来自分类Dev

iOS 7将颜色存储在阵列中

来自分类Dev

将实际文件存储在缓存中

来自分类Dev

PHP将变量存储在缓存中

来自分类Dev

WordPress 将 CSS 存储在缓存文件中?

来自分类Dev

在会话中存储阵列

来自分类Dev

在Rails中存储阵列

来自分类Dev

VBA:循环将数据行存储在阵列中

来自分类Dev

将阵列存储在XMP dc:Subject字段中

来自分类Dev

VBA:循环将数据行存储在阵列中

来自分类Dev

如何将时间戳放入本地存储的阵列中?

来自分类Dev

如何将输出存储到矩阵列表中

来自分类Dev

将结果存储到Play 2.2中的缓存中

来自分类Dev

使用Laravel 4上的循环将数据阵列存储到单个阵列中

来自分类Dev

将JSON数据存储在Android的移动缓存中

来自分类Dev

在localStorage中存储阵列错误

来自分类Dev

在MongoDB中存储大型阵列

来自分类Dev

在localStorage中存储阵列错误

来自分类Dev

我如何知道我的阵列存储在哪个缓存级别?

来自分类Dev

使用for循环将多个图像(3D阵列)存储到R中的4D阵列中

来自分类Dev

如何将存储过程存储在asp.net System.Web.Caching中的缓存中

来自分类Dev

将阵列添加到本地存储并检索该阵列

来自分类Dev

如何将Firebase存储项目存储到本地缓存中以节省带宽成本?

来自分类Dev

从缓存中存储和加载图像,图像将存储但不会加载

来自分类Dev

您如何将NSMutable阵列中的数据存储在核心数据中?

来自分类Dev

您如何将NSMutable阵列中的数据存储在核心数据中?

来自分类Dev

JQuery和Phonegap将本地存储中的数据保存在阵列中

来自分类Dev

将阵列保存到Chrome本地存储

Related 相关文章

热门标签

归档