每次迭代多次使用 ArrayList.get() 时是否有性能影响?



对于一般的Android开发,执行以下操作是否更昂贵: (示例 1)

for(int x=0; x < largeObjectCollection.size(); x++){
largeObjectCollection.get(x).SomeValueOne   = "Sample Value 1";
largeObjectCollection.get(x).SomeValueTwo   = "Sample Value 2";
largeObjectCollection.get(x).SomeValueThree = "Sample Value 3" ;
//Continues on to over 30 properties...
}

在此实现上(示例 2)

for(int x=0; x < largeObjectCollection.size(); x++){
SampleObjectIns myObject = largeObjectCollection.get(x);
myObject.SomeValueOne   = "Sample Value 1";
myObject.SomeValueTwo   = "Sample Value 2";
myObject.SomeValueThree = "Sample Value 3" ;
//Continues on to over 30 properties...
}

当多次使用.get()而不是每次迭代创建该对象的新实例时,我找不到任何性能影响的细分。

我认为.get()在资源方面不会使用太多资源,因为元素的位置已经知道,但是在处理许多属性时,最好只获取该对象一次,如示例二所示?

在循环构造中多次调用get()方法不会影响性能。

get() 方法不做任何搜索类型的东西。位置是已知的,因此RAM中的确切位置也是已知的。因此,它所需要的只是进行单个RAM访问,这是一个constant时间操作 - O(1)。

因此,您可以多次使用它,而不会对性能产生任何影响。但是一个更干净的方法是使用 get() 一次,将其存储在局部变量中,然后他们重用该变量。

第一种情况显然是可以做更多工作的情况。至少有两种可能性:

  • JIT 可能能够确定列表值没有更改,并且您正在重复请求相同的值;因此,它有效地将其转换为第二种形式。
  • ArrayList.get操作非常快;它基本上只是执行数组查找,它查找的值已经在缓存中,因为您刚刚查找了它。

    因此,您的计时测量由您正在做的其他工作主导。因此,即使您比必要的多 29 次get呼叫,30 次微小的数字仍然是一个很小的数字。

唯一的原因是,get数组的操作非常快,这就是为什么在性能上几乎没有明显差异的原因。

最新更新