Тип используемой структуры данных будет определяться данными, к которым вы хотите получить доступ. Некоторые вопросы, которые вы должны задать:
- Сколько предметов будет в хранилище сеансов? 50? 100000? 10000000000
- Насколько велика каждая позиция в магазине (размер в байтах)?
- Какой тип ввода строки используется для ключа? ASCII-7? UTF-8? UCS2?
...
Хеш-таблицы обычно очень хороши для поиска. Вы можете оптимизировать их для большей скорости, написав их самостоятельно (и да, вы можете изменить размер таблицы). Предложения по повышению производительности с помощью хеш-таблиц:
- Выберите хорошую хэш-функцию! желательно, чтобы оно было равномерно распределено по вашей хэш-таблице и не требовало значительных затрат времени (это будет зависеть от формата ввода с клавиатуры).
- Убедитесь, что если вы используете сегменты, длина которых не превышает 6. Если вы превышаете 6 сегментов, то ваша хэш-функция, вероятно, распределяется недостаточно равномерно. Длина ковша <3 предпочтительна. </li>
- Следите за тем, как вы распределяете свои объекты. Если это вообще возможно, попытайтесь разместить их рядом друг с другом в памяти, чтобы воспользоваться преимуществами ссылки. Если вам нужно, напишите свой собственный распределитель / менеджер кучи. Также придерживайтесь выровненных границ для лучшей скорости доступа (выровненный зависит от процессора / шины, поэтому вам нужно будет определить, хотите ли вы ориентироваться на конкретный тип процессора).
BTrees также очень хороши и в целом работают хорошо. (Кто-то может вставить информацию о деревьях здесь).
Я бы порекомендовал просмотреть данные, которые вы храните, и убедиться, что данные настолько малы, насколько это возможно. при необходимости используйте шорты, беззнаковый символ, битовые поля. Существуют и другие дополнительные способы выжать повышенную производительность, например выделение ваших строковых данных в конце вашей структуры одновременно с выделением структуры. т.е.
struct foo {
int a;
char my_string[0]; // allocate an instance of foo to be
// sizeof(int) + sizeof(your string data) etc
}
Вы также можете обнаружить, что реализация собственной процедуры сравнения строк может значительно повысить производительность, однако это будет зависеть от ваших входных данных.