При записи около 1М словари, лежащие в основе массива, неизбежно окажутся в LOH. Учитывая это, возможно, было бы неплохо предварительно выделить его в размере, соразмерном количеству записей, которые он в конечном итоге содержит (это может плохо отозваться и может быть проблемой в тестовом режиме).
Объекты в словаре должны обеспечивать очень хорошую реализацию хэш-кода. Это не относится к использованию памяти напрямую, просто к эффективности поиска. Однако, если вы торгуете более высоким коэффициентом загрузки за меньшее использование памяти, плохой хэш может в конечном итоге ухудшить поведение словарей до такой степени, что он больше не будет O (1).
Долгосрочные предметы, которые он содержит, должны либо:
(Наилучший случай) не содержат полей экземпляров, которые являются ссылочными типами.
- Тогда GC не нужно проходить через каждый из этих объектов в массиве (реализация GC может не выполнять эту оптимизацию, поэтому ваш пробег может варьироваться).
Убедитесь, что ваше приложение не переключается на Mid Life Crisis стиль поведения
- Запуск большего количества коллекций gen2, которых вы хотите избежать.
Любые содержащиеся в них ссылки не должны указывать на кучи Gen0 или Gen1
- Это может привести к большому количеству барьеров записи, что замедлит ваши коллекции gen 0 / gen 1.
Поскольку вы заявляете, что это кеш, но не упоминаете вашу политику хранения, я думаю, что этот совет тоже заслуживает упоминания.
Некоторое указание типа объектов, которые вы кэшируете, может иметь значение 4 / 8МБ или непрерывная память - это ужасно много даже при использовании современных кешей процессоров, поэтому частые запросы к кешу могут иметь более низкую производительность, чем более плотный, меньший кеш с лучшая политика хранения.