Подтвердить что ты не робот

Скорость списков С#

Бывают ли списки С#? Каковы хорошие и плохие стороны использования списков для обработки объектов?

Широкое использование списков сделает программное обеспечение более медленным? Каковы альтернативы спискам в С#?

Сколько объектов "слишком много объектов" для списков?

4b9b3361

Ответ 1

List<T> используется массив поддержки для хранения элементов:

  • Доступ индексатора (например, выборка/обновление) - это O (1)
  • Удалить из хвоста O (1)
  • Удаление из другого места требует, чтобы существующие элементы были сдвинуты вверх, поэтому O (n) эффективно
  • Добавить в конец - O (1), если это не требует изменения размера, и в этом случае это O (n). (Это удваивает размер буфера, поэтому амортизированная стоимость равна O (1).)
  • Добавить в другое место требует, чтобы существующие элементы были сдвинуты вниз, поэтому O (n) эффективно
  • Поиск элемента - это O (n), если он не отсортирован, и в этом случае двоичный поиск дает O (log n)

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

Ответ 2

По сравнению с чем?

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

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