我正在编写一款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
}
答案 0 :(得分:11)
这取决于。从理论上讲,第一个会更快,因为第二个将在每次迭代中进行函数调用。在实践中,这可以在很大程度上进行优化。大小可能会缓存在对象中,这只会留下函数调用的开销(实际上是零)。 但如果有疑问,请选择第一个。它不会慢。
但总的来说,请记住:过早优化是万恶之源。
不要选择特定的解决方案,因为您认为它们可能会快一纳秒。相反,写好,可靠和最重要的可读代码。然后,优化真正的瓶颈。
答案 1 :(得分:4)
要限制一次丢弃变量的范围,并且仍然只调用一次size()
,你可以写
for(int i=0, n = itemsList.size(); i < n; i++) {
// do stuff
}
在两种选择中进行选择时,按以下顺序对它们进行优先排序:
答案 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)
第一个更有效率,尽管只有非常略微给出了良好的编译器。
除非你每秒进行数百万次循环,否则它不会产生明显的差异。
原因:
答案 4 :(得分:0)
如果您使用
for(int i=0; i < itemsList.size(); i++)
{
// do stuff
}
您将始终调用itemsList.size() - 方法。因此,如果将此值存储在变量中,则会更快。并尝试使用最终变量; - )
答案 5 :(得分:-1)
如果你采取第二种方式itemsList.size()
每次必须计算。
如果itemsList
很大,可能需要一段时间