Для повышения эффективности - PullRequest
3 голосов
/ 29 июня 2011

Я пишу игру для Android и стараюсь быть максимально эффективной.

Я знаю, что цикл for более эффективен, чем foreach, но мне было интересно, есть ли разница в эффективности в следующих 2 элементах:1007 *

Ответы [ 6 ]

11 голосов
/ 29 июня 2011

Это зависит.В первый раз первый будет быстрее, так как второй придется выполнять вызов функции в каждой итерации.На практике это может быть оптимизировано в значительной степени.Размер, вероятно, будет кеширован в объекте, что оставляет только накладные расходы при вызове функции (который практически равен нулю).Но когда сомневаешься, выбирай первое.Это не будет медленнее.

Но в общем, помните: преждевременная оптимизация - корень всего зла.

Не выбирайте конкретные решения, потому что вы думаете, что они могут быть наносекундами быстрее.Вместо этого пишите хороший, надежный и, прежде всего, читаемый код.Затем оптимизируйте реальные узкие места.

4 голосов
/ 29 июня 2011

Чтобы ограничить область действия одноразовой переменной и по-прежнему вызывать size() только один раз, вы можете написать

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

При выборе между двумя альтернативами расставьте приоритеты в следующем порядке:

  1. Redability
  2. ремонтопригодность
  3. Понятность
  4. Clearity
  5. Тестируемость
  6. Логически
  7. Эффективность: -)
2 голосов
/ 29 июня 2011

если вы используете список только для чтения, вам следует использовать это

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

, но если вы удаляете элементы из списка, используйте этот подход

for(int i=0; i < itemsList.size(); i++)
{
   // do stuff
}
1 голос
/ 29 июня 2011

Первый более эффективен, хотя только очень незначительно при наличии хорошего компилятора.

Ничего заметного не произойдет, если вы не выполните цикл буквально миллионы раз в секунду.

Причина:

  • В первом случае предел цикла, вероятно, будет кэшироваться в регистре
  • Во втором случае цикл выполняет дополнительный поиск памяти в каждой итерации. Это связано с тем, что цикл не гарантирует, что размер не будет меняться на каждой итерации, поэтому необходимо постоянно проверять значение памяти. Технически, это также накладные расходы при вызове функции, хотя приличный JIT-компилятор, скорее всего, полностью ее оптимизирует путем встраивания.
0 голосов
/ 29 июня 2011

если вы используете

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

Вы всегда будете вызывать метод itemsList.size ().Таким образом, если вы сохраните это значение в переменной, вы будете быстрее.И попробуйте использовать конечные переменные; -)

0 голосов
/ 29 июня 2011

Если вы делаете второй путь, itemsList.size() должен рассчитываться каждый раз.

А если itemsList большой, это может занять некоторое время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...