用于循环效率

时间:2011-06-29 14:54:24

标签: java android for-loop performance

我正在编写一款Android游戏并尝试尽可能高效。

我知道for循环比foreach更有效,但我想知道以下两个项目的效率是否存在差异:

// itemsList is an ArrayList

int length = itemsList.size();            

for(int i=0; i < length; i++)
{
   // do stuff
}

VS

for(int i=0; i < itemsList.size(); i++)
{
   // do stuff
}

6 个答案:

答案 0 :(得分:11)

这取决于。从理论上讲,第一个会更快,因为第二个将在每次迭代中进行函数调用。在实践中,这可以在很大程度上进行优化。大小可能会缓存在对象中,这只会留下函数调用的开销(实际上是零)。 但如果有疑问,请选择第一个。它不会慢。

但总的来说,请记住:过早优化是万恶之源。

不要选择特定的解决方案,因为您认为它们可能会快一纳秒。相反,写好,可靠和最重要的可读代码。然后,优化真正的瓶颈。

答案 1 :(得分:4)

要限制一次丢弃变量的范围,并且仍然只调用一次size(),你可以写

for(int i=0, n = itemsList.size(); i < n; i++) {
   // do stuff
}

在两种选择中进行选择时,按以下顺序对它们进行优先排序:

  1. Redability
  2. 可维护性
  3. 可理解
  4. Clearity
  5. 可测
  6. 逻辑上
  7. 效率: - )

答案 2 :(得分:2)

如果您仅将列表用于读取,则应使用此

int length = itemsList.size();            
for(int i=0; i < length; i++)
{
   // do stuff
}

但如果从列表中删除元素,则使用此方法

for(int i=0; i < itemsList.size(); i++)
{
   // do stuff
}

答案 3 :(得分:1)

第一个更有效率,尽管只有非常略微给出了良好的编译器。

除非你每秒进行数百万次循环,否则它不会产生明显的差异。

原因:

  • 在第一种情况下,循环限制可能会缓存在寄存器
  • 在第二种情况下,循环在每次迭代中执行额外的内存查找。这是因为循环不能保证每次迭代时大小都不会改变,因此需要继续检查内存值。从技术上讲,还有一个函数调用的开销,尽管一个体面的JIT编译器可能会完全通过内联来优化它。

答案 4 :(得分:0)

如果您使用

for(int i=0; i < itemsList.size(); i++)
 {
  // do stuff
 }

您将始终调用itemsList.size() - 方法。因此,如果将此值存储在变量中,则会更快。并尝试使用最终变量; - )

答案 5 :(得分:-1)

如果你采取第二种方式itemsList.size()每次必须计算。

如果itemsList很大,可能需要一段时间