2014-11-25 177 views
-4

这个问题纯粹是关于速度和效率,而不是关注哪个是结构性更好的方法。Java:哪个更快,数组或对象?

基本上我需要一个视图模块读取的状态,这基本上是一个字符数组。这些字符的位置,名称,物品等

要么我可以使角色对象的阵列与吸气剂的信息,或我可以表示每个字符含有相同的信息的数组。

这两个办法的将是视图模块更快的阅读?

例如: 方法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

似乎不成熟的优化。有没有迹象表明,一个将要显着*比其他慢,或这两种方法将是缓慢的,足以进行任何优化,使之与一个是最简单的代码,阅读和维护去。或者换句话说,使用对象是因为它们具有特定的属性,这使得地狱更加有意义。 – 2014-11-25 12:01:10

+0

测试它呢? – 2014-11-25 12:01:11

+0

只有基准测试能够明确回答这个问题,但我敢打赌,对象更快;原因很简单,数组的版本需要大量的转换,这意味着JVM中的类型检查开销。 – 2014-11-25 12:02:10

回答

1

不应该有差别,至少后JIT踢让我们来看看在每一种情况下会发生什么:

案例1个阵列:

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

案例2对象的内存位置:

  • 我们从字符数组
  • 我们所说的吸气剂,吸气
  • 检索对象的内存地址,我们访问name字段

的存储位置,但是在JIT将内联吸气呼叫,使其:

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

所以,在JIT与我们一起完成之后,我们最终得到相同的代码。如果代码执行的时间不足以让JIT感兴趣,那么我们可能会忽略开销。另外,使用getter可以更容易地看到会发生什么。

+0

您忘记了数组边界检查,不能总是消除。 – maaartinus 2014-11-25 12:38:21

+0

正如上面在评论中提到的那样,我认为阵列版本需要'checkcast'来对阵列中的'Object'进行向下转换的每个访问,例如到'Integer';我不认为JIT可以消除这些检查。 – 2014-11-25 15:14:52

0

方法2是更内存效率 - 它涉及读取数据较少 - 这可能使其更快。但方法1中的内存访问模式可能更适合缓存/预取,这可能会产生更大的影响。与大多数性能问题一样,唯一真正的答案是直接描述您的特定用例,并查看哪些在实践中更快。