Список C # <> я должен уменьшить емкость при удалении элементов? - PullRequest
7 голосов
/ 23 августа 2011

У меня есть контейнер List, в котором потенциально может содержаться до 100 000 элементов.Пока программа работает, этот список будет медленно очищаться. Должен ли я изменять емкость по мере очистки списка?

Я провел некоторое тестирование, и время выполнения, похоже, такое же, но есть много накладных расходов для сниженияемкость списка?Я могу найти много информации об увеличении емкости, но не много о ее снижении.

Ответы [ 3 ]

10 голосов
/ 23 августа 2011

Если у вас очень мало памяти, это микрооптимизация.

Обычно нет необходимости изменять емкость List<>.

Из документации TrimExcess:

Этот метод можно использовать для минимизации накладных расходов на коллекцию, если в коллекцию не будут добавлены новые элементы. Однако затраты на перераспределение и копирование большого List<T> могут быть значительными, поэтому метод TrimExcess ничего не делает, если список занимает более 90 процентов емкости. Это позволяет избежать больших затрат на перераспределение при относительно небольшом выигрыше.

3 голосов
/ 23 августа 2011

Посчитайте: 100 000 элементов * 4 байта на элемент = примерно 400 КБ.Если для вашей программы это слишком много памяти, вы можете вызвать TrimExcess, поскольку Одед указывает, что воссоздает меньшие списки, когда они становятся меньше .(Я не уверен, что уменьшение емкости на самом деле будет иметь тот эффект, которого вы добьетесь.)

2 голосов
/ 23 августа 2011

Уменьшение емкости списка требует нового резервного массива и копирования данных, так что это относительно дорогая операция.

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

Одна стратегия, которая может быть использована, если она станет реальной проблемой, - это создать «кусочную» реализацию IList<>, которая использует не один массив, а несколько, каждый предварительно настроенного размера, с дополнительнымикуски (массивы фиксированного размера) добавляются по мере заполнения предыдущего.Это также позволяет сократить список относительно недорого, выпуская неиспользуемые чанки при удалении элементов, в то же время сводя к минимуму накладные расходы памяти только на один неполный чанк (последний).* все операций над списком, так как список должен рассчитать, какой чанк находится в элементе, и создать новые чанки по мере необходимости.Так что это бесполезно, если у вас действительно нет проблем с памятью и список, который действительно со временем меняет размер.

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