Список <T> или LinkedList <T>

Проблема заключается в том, что агент IoT предполагает, что устройство ответит JSON. Ответом по умолчанию на запрос является строка «ok». Это вызвало сбой в агенте.

Запрос считается успешным, если устройство возвращает {}, и еще более успешным, если возвращает некоторую информацию о результате выполнения команды. Э.Г.

{
  "ring": "successfully rung"
}
6
задан Michael Damatov 2 March 2009 в 21:59
поделиться

8 ответов

Короткий ответ
значение по умолчанию к использованию List<T> почти во всех случаях.

Немного более длинный ответ
LinkedList<T> только будет лучше, если Вы делаете большое добавление и удаление значений по сравнению с перечислением по тем значениям, и размер списка является большим. Это должно только быть фактором в Вашем выборе, последующий за профилированием при нахождении использования List<T> проблема.

Более длинный ответ

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

Это Вы делаете большой произвольный доступ затем List<T> почти всегда будет значительно быстрее несмотря ни на что. Если Вы перечисляете много и редко вставляете (или почти всегда вставляйте около/в конца), List<T> почти всегда будет быстрее. Если Вы постоянно вставляете/удаляете в случайные местоположения, но в то время как итерация по списку так уже в или около соответствующего узла и будет иметь по крайней мере несколько тысяч элементов, которые можно хотеть попробовать LinkedList<T>

Разработка, что значения/использование переводят в лучшую производительность, очень зависит от Вашего профиля использования. Микросравнительные тесты могут быть очень вводящими в заблуждение здесь, так как они рисуют кистью под аспектами ковра поведения связанных списков как узлы в в том, чтобы быть распределенным о в памяти, а не приятно смежный, если они, оказывается, выделяются внезапно в Ваших тестах. Аналогично предварительное создание List<T> с правильным размером может иметь большое значение.

Относительно стиля информатики, рассуждающего и большой нотации O (которым действительно нужен крупный N, чтобы быть значимыми в этом случае),

  • операция
    • стоимость List<T>
    • стоимость LinkedList<T>
  • вставьте в конце
    • O (1) (амортизируемая стоимость, выделение для удвоения размера по мере необходимости)
    • O (1) выделение каждый раз
  • вставьте в запуске
    • O (N) (хотя сделано как перемещение быстродействующей памяти так несколько сложное поведение времени выполнения)
    • O (1)
  • вставьте в местоположение x (и удалите также),
    • O (N-x) (см. комментарий для вставки в конце),
    • O (1)
  • передайте перечисление
    • O (N) (хотя минимизированные неудачные обращения в кэш)
    • O (N) (хотя в большой степени зависящий от местности кэша)
  • обратное перечисление
    • O (N)
    • O (N) ( LinkedList<T> реализация вдвойне связана),
  • произвольный доступ
    • O (1)
    • O (N)

Использование памяти сложно, так как Список может иметь в большей части количества - 1 избыточная ячейка в любой точке, но LinkedList<T> использует a LinkedListNode<T> для каждой ячейки, которая является еще 3 ссылками (4/8 байта за поп) плюс обычный объект наверху. В нормальном использовании, вероятно, победит Список, но снова это должно только быть чем-то, что Вы волнуете по поводу того, если Вы находите, что потребление памяти является на самом деле проблемой.

8
ответ дан 8 December 2019 в 02:06
поделиться

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

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

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

23
ответ дан 8 December 2019 в 02:06
поделиться

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

LinkedList<T> используемый для создания намного большего смысла, когда вещами не был связанный IO. Люди будут часто заключать ее кажущееся в кавычки "O (1)" природа. Однако это обесценивает истинную стоимость, которая идет с увеличенными возможностями отсутствий страницы, получающих узлы.

Если можно получить непрерывные регионы памяти с массивом или List<T> и избегайте потенциала отсутствия страницы, Вы очень более обеспечены с современными строками кэширования процессора и оперативной памяти.

Если Вы знаете, сколько элементов заранее Вы будете иметь, используйте массив. Если у Вас есть хорошая идея того, сколько элементов, используйте a List<T> (и в конструкторе передают вероятную верхнюю границу для потенциального предотвращения перераспределения).

Единственное время я использовал бы a LinkedList<T> то, если необходимо ударить объекты в списке одним значением постоянно. Например, если Вы реализуете последний использованный алгоритм кэширования и должны добавить что-то к передней стороне и взять что-то от конца.

Для мелочей это действительно не будет иметь значения. Сборщик "мусора" поколений будет уплотнять рассеянные объекты "кучи" вместе со временем, таким образом, связанный список не станет слишком плохим.

Я выбрал бы a List<T> и выполненный с ним, если Вы не заметили проблем (через профилирование)

7
ответ дан 8 December 2019 в 02:06
поделиться

Если индексный доступ не требуется, Вы, вероятно, более обеспечены с a LinkedList<T>. Нет большого различия, но LinkedList может быть быстрее для добавления.

3
ответ дан 8 December 2019 в 02:06
поделиться

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

Кроме этого:

LinkedList<T> обеспечивает отдельные узлы типа LinkedListNode<T>, таким образом, вставка и удаление являются O (1) операции.

отсюда.

7
ответ дан 8 December 2019 в 02:06
поделиться

Учитывая Ваши требования для интерфейса, необходимо использовать ICollection<T> везде в Вашем коде вместо того, чтобы относиться к конкретному реальному классу.

Причина - это, если Вы используете List затем можно записать набор кода, который использует l[0] получить первый объект. С другой стороны, если Вы используете LinkedList затем Вы могли бы распространить вызовы к AddLast всюду по Вашему коду. Для сохранения выбора переключиться необходимо постараться не становиться случайно зависящими от функций, в которых Вы действительно не нуждаетесь. Необходимо использовать интерфейс, который могут поддерживать оба контейнера.

Так запишите класс как это:

public static class Collections
{
    public static ICollection<T> Make<T>()
    {
        return new List<T>();
    }
}

Затем каждый раз, когда Вам нужен набор, сделайте это:

ICollection<int> c = Collections.Make<int>();

Изолируйте свой выбор контейнера от остальной части Вашей программы. Теперь, когда Вы представляете и передумали, просто необходимо отредактировать Make<T> метод.

2
ответ дан 8 December 2019 в 02:06
поделиться

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

0
ответ дан 8 December 2019 в 02:06
поделиться

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

0
ответ дан 8 December 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: