C # Увеличение массива на один элемент в конце - PullRequest
4 голосов
/ 16 февраля 2010

В моей программе есть несколько растущих массивов, в которых новый элемент растет один за другим до конца массива. Я определил списки как узкое место в скорости в критической части моей программы из-за их медленного времени доступа по сравнению с массивом - переключение на массив значительно повысило производительность до приемлемого уровня. Поэтому для увеличения массива я использую Array.Resize. Это работает хорошо, так как моя реализация ограничивает размер массива примерно до 20 элементов, поэтому производительность O (N) для Array.Resize ограничена.

Но было бы лучше, если бы был способ просто увеличить массив на один элемент в конце без использования Array.Resize; Я считаю, что делает копию старого массива в массив нового размера.

Итак, мой вопрос, есть ли более эффективный метод для добавления одного элемента в конец массива без использования List или Array.Resize?

Ответы [ 7 ]

10 голосов
/ 16 февраля 2010

A List имеет постоянный доступ по времени, как массив. Для «растущих массивов» вы действительно должны использовать List.

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

3 голосов
/ 16 февраля 2010

Как уже упоминалось ранее, List<T> - это то, что вы ищете. Если вы знаете начальный размер списка, вы можете указать начальную емкость для конструктора , что повысит вашу производительность при начальных распределениях:

List<int> values = new List<int>(5);

values.Add(1);
values.Add(2);
values.Add(3);
values.Add(4);
values.Add(5);
2 голосов
/ 16 февраля 2010

Нет способа изменить размер массива, поэтому единственный способ получить массив большего размера - использовать Array.Resize для создания нового массива.

Почему бы просто не создать массивы, чтобы в начале было 20 элементов (или любую необходимую вам емкость), и использовать переменную, чтобы отслеживать, сколько элементов используется в массиве? Таким образом, вам никогда не придется изменять размеры каких-либо массивов.

1 голос
/ 16 февраля 2010

Список выделяет 4 элемента для начала (если вы не указали емкость при ее создании), а затем увеличивается каждые 4 элемента.

Почему бы вам не попробовать подобное с Array? То есть создайте его как имеющий 4 элемента, затем при вставке пятого элемента сначала увеличьте массив еще на 4 элемента.

0 голосов
/ 16 февраля 2010

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

0 голосов
/ 16 февраля 2010

гораздо быстрее изменить размер массива в виде блоков (например, 10) и сохранить его как отдельную переменную, например, емкость, а затем изменять размер массива только при достижении емкости. Это то, как работает список, но если вы предпочитаете использовать массивы, вам следует обратить внимание на изменение их размера большими кусками, особенно если у вас большое количество вызовов Array.Resize

0 голосов
/ 16 февраля 2010

Увеличение массива AFAIK означает, что выделяется новый массив, а существующий контент копируется в новый экземпляр. Я сомневаюсь, что это должно быть быстрее, чем использовать List ...?

...