【发布时间】:2015-04-10 20:39:18
【问题描述】:
我正在审查一个面试问题并与朋友比较笔记,我们对 CPU 缓存有不同的想法。
考虑一大组数据,比如double的大数组,即:
double data[1024];
考虑使用动态分配的动态链表来存储相同数量的元素。该问题要求描述一些权衡:
- 允许更快的随机访问:我们都同意数组更快,因为您不必以线性方式遍历列表 (
O(n)),只需提供一个索引 (O(1))。李> - 比较两个相同长度的列表更快:我们都决定如果它只是原始数据类型,则数组将允许
memcmp(),而链表需要逐元素比较加上取消引用开销。 - 如果您多次访问同一个元素,哪种方式可以提高缓存效率?
在3 点,这就是我们意见不同的地方。我争辩说 CPU 会尝试缓存整个数组,如果数组非常大,它就不能存储在缓存中,因此不会有缓存的好处。使用链表,可以缓存单个元素。因此,在处理大量元素时,链表比静态数组更适合缓存“命中”。
对于问题:两者中哪一个更适合缓存“命中”,现代系统可以缓存数组的一部分,还是他们需要整个数组或者它不会尝试?我也可以用来提供明确答案的任何对技术文档或标准的引用都会有很大帮助。
谢谢!
【问题讨论】:
标签: c arrays performance caching linked-list