Рекомендуется ли указывать начальный размер коллекций? - PullRequest
1 голос
/ 08 января 2009

Многие классы коллекций в .Net (то есть, List , Dictionary ) имеют перегруженный конструктор, который позволяет указать начальный размер емкости. Это лучший способ использовать этот конструктор? Если да, то есть ли какое-то правило относительно какого-то «магического числа», которое вы должны использовать? Одно дело, если я заранее знаю точный размер, но что, если я не знаю?

Ответы [ 2 ]

4 голосов
/ 08 января 2009

Лучше ли использовать этот конструктор?

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

Чтобы привести пример, используя структуру данных List:

В обоих случаях вставка фактически имеет одинаковое амортизированное постоянное время выполнения. Это означает, что независимо от размера контейнера операция Add будет занимать постоянное время. Однако это верно только в среднем. Если размер контейнера должен быть внутренним, потому что в противном случае он был бы переполнен, эта операция Add фактически принимает O ( n ), то есть его время пропорционально размеру контейнера.

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

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

Если да, то есть ли какое-то правило относительно какого-то "магического числа", которое вы должны использовать?

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

1 голос
/ 08 января 2009

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

Обычно, если я точно знаю размер своей коллекции до ее создания, я просто создаю массив и возвращаю его как IEnumerable<T>

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