Ответ 1
Используя Reflector, я нашел следующее: Словарь хранит данные в массиве struct. Он подсчитывает, сколько пустых мест осталось в этом массиве. Когда вы добавляете элемент и пустое место не остается, оно увеличивает размер внутреннего массива (см. Ниже) и копирует данные из старого массива в новый массив.
Итак, я бы предложил вам использовать конструктор, в котором вы устанавливаете начальный размер, если знаете, что будет много записей.
EDIT: логика на самом деле довольно интересная: для поиска простых чисел существует внутренний класс HashHelpers
. Чтобы ускорить это, он также сохранил некоторые простые числа в статическом массиве от 3 до 7199369 (некоторые из них отсутствуют, по этой причине см. Ниже). Когда вы добавляете емкость, она находит следующий массив (то же значение или больше) из массива и использует его как начальную емкость. Если вы даете ему большее количество, чем в своем массиве, он начинает проверку вручную.
Итак, если ничего не передается как емкость для Словаря, стартовая емкость - три.
Как только мощность превышена, она умножает текущую емкость на два, а затем находит следующее большее простое значение с использованием класса-помощника. Вот почему в массиве не обязательно каждое простое, так как простые числа "слишком близко друг к другу" на самом деле не нужны.
Итак, если мы не получим начального значения, мы получим (я проверил внутренний массив):
- 3
- 7
- 17
- 37
- 71
- 163
- 353
- 761
- 1597
- 3371
- 7013
- 14591
- 30293
- 62851
- 130363
- 270371
- 560689
- 1162687
- 2411033
- 4999559
Как только мы передаем этот размер, следующий шаг выходит за пределы внутреннего массива, и он будет вручную искать большие простые числа. Это будет довольно медленно. Вы можете инициализировать с помощью 7199369 (наибольшее значение в массиве) или подумать, может ли иметь более 5 миллионов записей в словаре, что вы должны пересмотреть свой дизайн.