Map vs unordered_map для нескольких элементов
Я пытаюсь выбрать между map
и unordered_map
для следующего использования:
Ключ map
- это указатель.
Наиболее распространенным вариантом использования является то, что на карте будет один элемент.
В общем, максимальное количество элементов на карте меньше 10.
Доступ к карте осуществляется очень часто, и скорость является самым важным фактором. Изменения на карте нечасты.
Измеряя скорость, очевидно, правильный подход здесь, этот код будет использоваться на нескольких платформах, поэтому я пытаюсь создать общее правило для выбора между map
и unordered_map
на основе количества элементов, Я видел здесь несколько сообщений, которые подсказывают, что std:: map может быть быстрее для небольших элементов, но определение "small" не было указано.
Есть ли правило для того, чтобы выбрать между map
и unordered_map
в зависимости от количества элементов? Еще лучшая структура данных (например, линейный поиск через vector
)?
Ответы
Ответ 1
В предположении, что вам всегда нужно измерять, чтобы выяснить, что более уместно с точки зрения производительности, если все это верно:
- Изменения на карте не часто встречаются;
- Карта содержит не более 10 элементов;
- Поиск будет частым,
- Вы заботитесь о производительности,
Тогда я бы сказал, что вам лучше разместить свои элементы в std::vector
и выполнить простую итерацию по всем вашим элементам, чтобы найти тот, который вы ищете.
An std::vector
будет выделять свои элементы в смежном регионе памяти, поэтому локальность кэша, скорее всего, даст вам большую производительность - время, необходимое для извлечения строки кэша из основной памяти после промаха в кеше, по крайней мере, одного порядка на величину, превышающую время, необходимое для доступа к кэшу ЦП.
Довольно интересно, что Boost flat_map
идеально подходит для вашего случая использования (любезно предоставлено Praetorian):
flat_map
похож на std::map
, но он реализован как упорядоченный вектор. (из онлайн-документации)
Итак, если вы используете Boost для вас, вы можете попробовать это.
Ответ 2
Я считаю, что ваш случай из 10 элементов или меньше, и обычно только один линейный поиск несортированного вектора будет работать лучше всего. Однако, в зависимости от используемого алгоритма хеширования, функция unordered_map может быть быстрее.
Вам должно быть достаточно легко ориентироваться.