2015-04-28 53 views
7

我最近一直检查代码的注意到使用该语法在for循环中在声明变量的for循环的阵列长度

for(int i = 0, len = myArray.length; i < len; i++){ 
    //some code 
} 

,而不是:

for(int i = 0; i < myArray.length; i++){ 
    //some code 
} 

有理由说它更高效,因为您不必每次循环查找myArray.length属性。

我创建了一个测试来检查这是否是这种情况,在我的所有测试中,第一个for循环方法比第二个方法快得多(大约70%)。

我很好奇为什么这个语法没有被更广泛的采用,我认为这是一个更好的方法来通过数组使用for循环。

+2

“我很好奇为什么这个语法没有被更广泛的采用,我认为这是一个更好的方法来通过数组使用for循环。 “ 因为大多数人今天使用迭代器:-) – Smutje

+2

恕我直言,第一种语法没有被广泛使用,因为它是一个微型优化,如果你需要挤出那么多的性能,可能你必须重新考虑很多事情,循环可能是最后一个。 –

+0

这是一个很好的观点。即使我不喜欢在for循环中使用.size()和.length()方法。更可接受的方法是(String str:myarray){} – raki

回答

5

这是一个缓存优化,如您所述,可防止多次读取length。通常,不需要执行这种微型优化,这可以解释为什么大多数工程师都乐于在每个循环之后检查length而不是缓存它,但是它在高性能代码中很有用。它也可以写成这样,反转环的方向并避免使用另一个变量来保存数组的长度:

for (int i = myArray.length - 1; i >= 0; i--) { 
    // some code 
} 
0

第一种方法评估长度只有一次,而不是评估每个循环长度的第二种方法。

+0

那里没有计算,只有字段访问,它很可能会被优化。 – amit

+0

我改变了计算这个词来评估,但在我看来,JVM会优化这个 – Steph

0

在我看来,大部分的Java程序员的去与-每个的情况下,环除非我们想用索引值做一些操作

+0

但是这种做法在Java 5之前并不流行。 – Mordechai