Использовать list.size () или переменную для многократного использования?(локальная оптимизация) - PullRequest
3 голосов
/ 12 июля 2011

У меня есть простая функция, которая называется много.

Внутри этой функции у меня много обращений к размеру списка (содержащего около 10 элементов):

list.size()

Быстрее ли мне использовать временную переменную для получения размера только один раз или быстрее вызывать метод size() каждый раз ?

Обновление : это ArrayList.

Примечание: я знаю, что делаю, я не ищу лекцию об оптимизации и о том, как это следует или не нужно делать. Я просто ищу ответ.

Ответы [ 4 ]

10 голосов
/ 12 июля 2011

Это полностью зависит от реализации. Вы не указали тип list - я предполагаю, что это List<E> или какая-то конкретная реализация.

В некоторых реализациях, таких как ArrayList<E>, это очень дешево - доступ к полю, в основном. Это только задокументировано с точки зрения постоянного времени, по общему признанию:

Операции size, isEmpty, get, set, iterator и listIterator выполняются в постоянное время.

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

7 голосов
/ 12 июля 2011

Это зависит от реализации List Просмотр источника ArrayList

/**
  225        * Returns the number of elements in this list.
  226        *
  227        * @return the number of elements in this list
  228        */
  229       public int size() {
  230           return size;
  231       }
  232   

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

4 голосов
/ 12 июля 2011

Проверьте это (из ArrayList, а также LinkedList):

/**
 * Returns the number of elements in this list.
 *
 * @return the number of elements in this list
 */
public int size() {
return size;
}

Вызов list.size() примерно так же эффективен, как вызов метода и помещение значения в стек: (почти)незначителен.Конечно, вы будете немного быстрее, используя локальную (final) переменную.Если это важное улучшение в контексте вашего приложения или нет, вам, вероятно, придется измерить.

0 голосов
/ 12 июля 2011

Независимо от того, насколько быстрый size() вызов метода.Рекомендуется вводить переменную для переноса результата метода, если этот метод вызывается несколько раз внутри блока кода, предполагая, что метод ничего не меняет.

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