2015-04-28 5 views
7

Я недавно пересматривал закодировать заметили использование этого синтаксиса в циклеОбъявление переменной в цикле для длины массива

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

в противоположность:

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

С учетом того, что он более эффективен, так как вам не нужно постоянно искать свойство myArray.length с каждым циклом.

Я создал тест, чтобы проверить, было ли это так, и во всех моих тестах первый подход к петле был значительно (около 70%) быстрее, чем второй.

Мне было любопытно, почему этот синтаксис не более широко принят и что я прав, думая, что это лучший подход к использованию цикла for через массив.

+2

«Мне было любопытно, почему этот синтаксис не более широко принят и что я прав, думая, что это лучший подход к использованию цикла for через массив. " Поскольку большинство людей используют итераторы сегодня :-) – Smutje

+2

IMHO первый синтаксис не используется широко, поскольку это микро-оптимизация, если вам нужно выжать такое количество производительности, возможно, вам нужно переосмыслить много вещей, а 'for 'loop может быть последним. –

+0

Это хороший момент. Даже мне не нравится использовать методы .size() и .length() в цикле for. Более приемлемый подход был бы для (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

Смежные вопросы