Java:哪个更快,数组或对象?

时间:2014-11-25 11:57:13

标签: java arrays performance

这个问题纯粹是关于速度和效率,而不是结构更好的方法。

基本上我需要一个视图模块来读取一个状态,它本质上是一个字符数组。这些角色有位置,名称,项目等。

我可以用信息的getter创建一个字符对象数组,或者我可以将每个字符表示为包含相同信息的数组。

视图模块读取这两种方法中的哪一种会更快?

例如: 方法1

for(int i = 0; i < characters.length(); i++){
  Character temp = character[i];
  this.drawName(temp.getName());
  this.drawCharacterAt(temp.getColor(), temp.getX(), temp.getY())
  ....
}

接近2

for(int i = 0; i < characters.length(); i++){
  this.drawName(character[i][0]);
  this.drawCharacterAt(character[i][1],character[i][2],character[i][3]);
  ....
}

2 个答案:

答案 0 :(得分:1)

至少在JIT开始之后应该没有区别。让我们来看看每种情况下会发生什么:

案例1数组:

  • 我们从字符数组中检索数组对象的内存地址
  • 我们访问第一个数组元素的内存位置

案例2对象:

  • 我们从字符数组中检索对象的内存地址
  • 我们称之为getter
  • 在getter中,我们访问名称字段的内存位置

然而,JIT将内联该getter调用,使其成为:

  • 我们从字符数组中检索对象的内存地址
  • 我们访问名称字段的内存位置

因此,在我们完成JIT之后,我们最终会得到相同的代码。如果代码的执行频率不足以使JIT感兴趣,那么我们可能无论如何都会忽略开销。另外,使用吸气剂可以更容易地看到会发生什么。

答案 1 :(得分:0)

方法2更节省内存 - 它涉及读取更少的数据 - 这可以使其更快。但是,方法1中的内存访问模式可能对缓存/预取更加友好,这可能会产生更大的影响。与大多数性能问题一样,唯一真正的答案是直接分析您的特定用例,并了解哪种用例在实践中更快。