【问题标题】:Java object arrays - use of hardware memory cacheJava对象数组——硬件内存缓存的使用
【发布时间】:2016-06-30 08:44:51
【问题描述】:

由于缓存,迭代数组的连续元素通常被认为比迭代连续链表元素更有效。

只要元素具有基本数据类型,这无疑是正确的。但是如果元素是对象,我的理解是只有对对象的引用才会存储在数组的连续内存区域(很可能会被缓存),而实际的对象数据将存储在主内存中的任何位置,不能被有效缓存。

由于您通常不仅迭代容器,而且还需要在每次迭代中访问对象数据,这是否或多或少地扼杀了数组相对于列表的性能优势?

编辑:关于不同场景差异很大的评论可能是正确的。所以让我们考虑一个特定的:您在容器中搜索一个特定的对象。为了找到它,您需要将给定的字符串与作为对象的类变量的另一个字符串进行比较。

【问题讨论】:

  • “我的理解是,只有对象的引用才会存储在数组的连续内存区域”正确。问题其余部分的答案是“视情况而定”。不同的场景差异很大,这个问题没有通用的答案。
  • 也许吧。不过有趣的问题;但如果你得到更多有用的答案而不是投票和关闭请求,我会感到惊讶。
  • IMO 数组仍然提供更快的访问,因为与 LinkedList 相比,到达下一个节点所需的操作数量更少。

标签: java arrays memory-management linked-list cpu-cache


【解决方案1】:

不,对于对象(“指针”),两者都有间接关系。每个节点都需要一个链表才能跳到下一个节点。所以它仍然有开销。

但是,是的,相对而言,增益仅涉及一部分,非常大致是纯遍历的一半,包括间接步骤。

当然,每个间接访问都会使访问更加混乱、速度变慢。

顺便说一句,ArrayList 也和数组一样快。

【讨论】:

  • 在这种情况下,我希望ArrayList 表现得像一个数组。
  • 是的,我想提一下是为了不把人追到数组里,当 List 更合适的时候。
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多