Использование LinkedList или ArrayList для итерации - PullRequest
16 голосов
/ 08 декабря 2011

Если я добавляю неизвестное количество элементов в список, и этот список будет только итерироваться, будет ли LinkedList лучше, чем ArrayList в конкретном экземпляре (с использованием Java, если это имеет какое-либо значение)

Ответы [ 3 ]

20 голосов
/ 08 декабря 2011

Компромисс производительности между ArrayList и LinkedList обсуждался до , но вкратце: ArrayList, как правило, быстрее для большинства реальных сценариев использования.ArrayList приведет к меньшей фрагментации памяти и будет лучше работать с сборщиком мусора, он будет занимать меньше памяти и позволит быстрее выполнять итерации, а также будет быстрее для вставок, которые происходят в конце списка.

Таким образом, поскольку вставки в списке всегда происходят в последней позиции, нет причин выбирать LinkedList - ArrayList - явный победитель.

3 голосов
/ 08 декабря 2011

Для итерации оба будут иметь одинаковую сложность O (n) при итерации, ArrayList будет занимать меньше памяти BTW.

2 голосов
/ 08 июня 2018

Хорошо. Уже ответили, но я все же постараюсь изложить свою точку зрения.ArrayList быстрее в итерации, чем LinkedList.Причина та же, потому что arrayList поддерживается массивом.Давайте попробуем понять, почему итерация массива происходит быстрее, чем linkedList.

Для этого есть 2 фактора

  • Массив хранится как contiguous memory locations (Вы можете сказать тогда
    что?)
  • Системный кеш гораздо быстрее, чем доступ к памяти

Но вы можете спросить, как Cache подходит здесь.Хорошо, проверьте здесь , CPU пытается использовать рычаги кэшей, сохраняя данные в кэше.Используется Локальная привязка . Теперь есть 2 метода:

Ссылка Локальная привязка

Временная локальность Если в какой-то момент ссылка на конкретную ячейку памяти указана, то, скорее всего, в ближайшем будущем эта ссылка будет снова указана.Существует временная близость между соседними ссылками на одну и ту же ячейку памяти.В этом случае принято прилагать усилия для сохранения копии указанных данных в специальном хранилище памяти, к которому можно получить доступ быстрее.Временная локализация - это особый случай пространственной локализации, а именно, когда предполагаемое местоположение идентично текущему местоположению.

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

Так что, если к одному местоположению массива обращаются одновременноон также загрузит смежные области памяти в кеш.Но ждать это не загрузит все.Это зависит от CACHE_LINES .Хорошо CACHE_LINES определяет, сколько бит может быть загружено в кэш за один раз.

Поэтому перед погружением давайте напомним, что мы знаем

  • Массив равен contiguous memory locations
  • Когда к одной ячейке памяти массива обращаются рядом, также загружается в память
  • Сколько мест памяти массива загружается в память, определяется CACHE-LINES емкость

SO, когда процессор пытаетсячтобы получить доступ к ячейке памяти, проверьте, находится ли эта память в кеше.Если он присутствует, он совпадает с другим cache miss.

Так что из того, что мы знаем в случае массива, будет меньше cache_miss по сравнению с random memory locations как в linked list.Таким образом, имеет смысл

и, наконец, отсюда Array_data_structure из Википедии он говорит

В массиве с размером элемента k и на машине с размером строки кэшаиз B байтов, итерация по массиву из n элементов требует минимального количества нехватки кеша (nk / B), потому что его элементы занимают смежные области памяти.Это примерно в B / k раз лучше, чем количество пропущенных кешей, необходимых для доступа к n ​​элементам в случайных местах памяти.Как следствие, последовательная итерация по массиву на практике заметно быстрее, чем итерация по многим другим структурам данных, свойство, называемое locality of refrence

Я полагаю, это отвечает на ваш вопрос.

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