Создание переменных заранее для использования в циклах (?) - PullRequest
3 голосов
/ 15 ноября 2011

Какой из этих двух вариантов более «эффективен»:

for (int i = 0; i < 10; i++) {
    int x = i * 2;
}

или -

int x;
for (int i = 0; i < 10; i++) {
    x = i * 2;
}

(просто пример)

Я понимаюпо сути, они различны - поэтому, пожалуйста, не обращайте внимания на разницу в их использовании.

В случае, когда оба окажутся одинаковыми, создание переменной x несколько раз будетменее эффективный метод, чем просто создать его один раз и просто переназначить его значение?

Ответы [ 7 ]

5 голосов
/ 15 ноября 2011

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

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

Тем не менее, в качестве бонусного раздела к этому ответу:

for (int x = 0; x < calculateUserCountFromDatabaseOrSomething(); x++) {
   //Do stuff
} 

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

1 голос
/ 15 ноября 2011

Если вы хотите получить окончательный ответ, отметьте это:

http://livingtao.blogspot.com/2007/05/myth-defining-loop-variables-inside.html

Проводит сравнение байтового кода с результатами компиляции.

Ответ: Между прочим, .

1 голос
/ 15 ноября 2011

Эффективность должна быть такой же - я ожидаю, что байт-код будет точно таким же.

Однако, что вам действительно нужно , действительно беспокоит читаемость и удобство сопровождения кода, что лучше при первом подходе, так как ограничивает область действия x, делая ее более понятной там, где она будет использоваться.

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

0 голосов
/ 15 ноября 2011

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

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

0 голосов
/ 15 ноября 2011

Переменная не создается несколько раз:

for ( A; B; C ) {
    D;
}

Исполнение таково: A - (B - D - C) ... (B - D - C), пока B не станет ложным

0 голосов
/ 15 ноября 2011

Поскольку вы выделяете место только для одного целого вместо десяти целых, во втором сценарии оно должно быть быстрее.Однако на самом деле компилятор Java почти наверняка оптимизирует это до такой степени, что микробенчмарки скажут, что они заняли одно и то же время.

0 голосов
/ 15 ноября 2011

Зависит от типа объектов.Например, если X - это строка, это не будет иметь большого значения.Если, например, X - это какой-то тип Map, вы можете инициализировать его один раз и очищать каждый раз в конце итерации.В случае X является int, это действительно не имеет значения, с точки зрения эффективности.Запомните область действия переменной, объявив ее вне цикла, и предполагает, что она будет использоваться после этого.

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