Java:数组和对象哪个更快?

Java:数组和对象哪个更快?,java,arrays,performance,Java,Arrays,Performance,这个问题纯粹是关于速度和效率,而不是考虑哪一个是更好的方法 基本上我需要一个视图模块来读取一个状态,它本质上是一个字符数组。这些字符有位置、名称、项目等 我可以创建一个包含信息获取器的character对象数组,也可以将每个字符表示为包含相同信息的数组 这两种方法中,哪一种对视图模块的读取速度更快 例如: 方法1 for(int i = 0; i < characters.length(); i++){ Character temp = character[i]; this.dra

这个问题纯粹是关于速度和效率,而不是考虑哪一个是更好的方法

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

我可以创建一个包含信息获取器的character对象数组,也可以将每个字符表示为包含相同信息的数组

这两种方法中,哪一种对视图模块的读取速度更快

例如: 方法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的内存效率更高——它需要读取更少的数据——这可以使它更快。但是方法1中的内存访问模式可能对缓存/预取更友好,这可能会产生更大的影响。与大多数性能问题一样,唯一真正的答案是直接分析您的特定用例,看看哪一个在实践中更快。

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

案例1阵列:

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

我们从字符数组中检索对象的内存地址 我们称之为getter 在getter中,我们访问name字段的内存位置 但是,JIT将内联该getter调用,使其:

我们从字符数组中检索对象的内存地址 我们访问名称字段的内存位置
所以,在我们完成JIT之后,我们基本上会得到相同的代码。如果代码的执行频率不足以引起JIT的兴趣,那么我们可能会忽略开销。另外,使用getter更容易看到发生了什么。

似乎是过早的优化。没有迹象表明一种方法明显比另一种慢,或者任何一种方法都慢到需要任何优化,所以选择最容易编码、阅读和维护的方法。或者,换句话说,使用对象是因为它们具有特定的属性,这就更有意义了。那么测试它呢?只有基准测试才能明确回答这个问题,但我敢打赌对象会更快;原因很简单,带有数组的版本需要大量的强制转换,这意味着JVM中的类型检查开销。多好的主意啊!你称之为像draw*一样慢的东西,并考虑优化单个内存访问。@maaartinus感谢你的投入,Condenscending先生。我会记得,我的程序中最慢的一次调用应该设置优化的标准。你忘记了数组边界检查,它不能总是被消除。正如上面在评论中提到的,我认为数组版本要求对数组中的每个对象进行检查,例如,到整数;我认为JIT不能消除这些检查。