В справочном источнике для ConcurrentDictionary<TKey, TValue>
вы можете увидеть:
Node[] buckets = new Node[capacity];
Таким образом, емкость - это эффективный размер таблицы ha sh. Никакая "полнота" не рассматривается. Единственная предварительная обработка этого числа:
if (capacity < concurrencyLevel)
{
capacity = concurrencyLevel;
}
, где concurrencyLevel
либо определяется вами через параметр конструктора, либо является уровнем параллелизма по умолчанию, определенным как PlatformHelper.ProcessorCount
.
Емкость трактуется по-разному в Dictionary<TKey,TValue>
. Здесь он инициализируется с помощью
private void Initialize(int capacity) {
int size = HashHelpers.GetPrime(capacity);
buckets = new int[size];
...
}
, а HashHelpers.GetPrime
получает наименьшее простое число, которое больше или равно указанной емкости. Простые числа до 7199369
взяты из предварительно рассчитанного массива. Лагерные рассчитываются "трудным путем". Интересно отметить, что наименьшее из рассмотренных простых чисел - 3
.
К сожалению, HashHelpers
является внутренним классом.
Если я правильно понимаю, обе реализации изменяют размер ha * 1042. * таблица, основанная на количестве столкновений и не основанная на заданном c коэффициент заполнения ("заполненность").
Если вы хотите
- оптимизировать скорость: возьмите начальная емкость, которая на 30% больше ожидаемого максимального размера словаря. Это позволяет избежать изменения размера.
- оптимизировать объем памяти: взять простое число, которое примерно на 30% больше ожидаемого размера минимум .
- баланс между скоростью и объемом памяти: Возьмите число между двумя сверху. Но в любом случае взять прайм.