List.clear () против выполнения задания о переназначении - PullRequest
0 голосов
/ 27 сентября 2018

В моем коде я запрашивал список из 10 тыс. Элементов, используя findAll из хранилища.

Существует только одна ссылка List, которой я присваиваю результат findAll, затем запускаю цикл для элементов List.

Общее количество записей в БД обычно несколько раз превышает 10 КБ, т. Е. Цикл в настоящее время повторяется где-то между 6 и 12 разами.

Что я заметил, так это то, что последовательная обработка в этом цикле начинает занимать больше времени после примерно 20 000 операций чтения или около того.

Вместо назначения ссылки, если я использую List.addAll() для findAll элементов и перед добавлением следующего фрагмента элементов, я очищаю список, используя List.clear(), тогда время выполнения итерации остается постоянным и не увеличивается последовательно,

Код с увеличением времени итерации,

while(condition){
  List<T> reference = repo.findAll()
  for(T t:reference){
   //Processing 
  }
  //Check Condition if its false
}

Постоянное время,

List<T> reference = new ArrayList<>();
while(condition){
  reference.addAll(repo.findAll())
  for(T t:reference){
   //Processing 
  }
reference.clear();
//Check Condition if its false
}

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

Схожий вопрос - list.clear () vs list = new ArrayList ()

1 Ответ

0 голосов
/ 27 сентября 2018

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

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

См .: Почему метод ArrayList.clear () не освобождает память?

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