Очевидный вопрос: почему вы хотите использовать хеш?
Я понимаю проблему с map
/ set
для кода, критичного к производительности, ведь эти контейнеры не очень удобны для кэширования, поскольку элементы могут размещаться в очень разных местах памяти.
Как предложил KeithB (я не буду комментировать использование двоичного представления, так как ничто не гарантирует, что 2 идентификатора имеют одинаковое двоичное представление в конце концов ...), использование отсортированного vector
может ускорить код в случае, если есть очень мало предметов.
Сортированные векторы / запросы намного более удобны для кэша, однако они страдают от сложности O (N) при вставке / удалении из-за копирования. Как только вы достигнете пары сотен потоков (кстати, никогда их не видели), это может повредить.
Однако существует структура данных, которая пытается связать выгоды от карт и отсортированных векторов: B + Tree .
Вы можете просмотреть его как карту, для которой каждый узел будет содержать более одного элемента (в отсортированном порядке). Используются только листовые узлы.
Чтобы повысить производительность, вы можете:
- Линейное связывание листьев: т. Е. Корень кэширует указатель на первый и последний лист, и листья связаны между собой, так что линейное перемещение полностью обходит внутренние узлы.
- Кэшируйте последний доступный лист в корне, в конце концов, вероятно, это также будет следующий доступ.
Асимптотические характеристики те же, что и для карты, поскольку она реализована в виде сбалансированного двоичного дерева, но поскольку значения упакованы в группы, ваш код может стать быстрее благодаря константе.
Реальная сложность состоит в том, чтобы настроить размер каждого «сегмента», для этого вам потребуется некоторое профилирование, поэтому было бы лучше, если бы ваша реализация позволила внести некоторые изменения в него (поскольку это будет зависеть от архитектуры, на которой написан код). выполняется).