У меня есть следующая проблема. У меня есть игра, которая работает в среднем 60 кадров в секунду. Каждому кадру мне нужно хранить значения в контейнере и не должно быть дубликатов.
Вероятно, он должен хранить менее 100 элементов на кадр, но количество вставных вызовов будет намного больше (и многие из них отклоняются из-за того, что он должен быть уникальным). Только в конце рамки мне нужно пройти контейнер. Таким образом, около 60 итераций контейнера на кадр, но еще больше вставок.
Имейте в виду, что элементы для хранения - это простые целые числа.
Есть куча контейнеров, которые я могу использовать для этого, но я не могу решить, что выбрать. Производительность является ключевой проблемой для этого.
Некоторые плюсы/минусы, которые я собрал:
вектор
- (PRO): Неповторимая память, огромный фактор.
- (PRO): память может быть зарезервирована во-первых, очень мало ассигнований/освобождений впоследствии
- (CON): нет альтернативы перемещению контейнера (std:: find) для каждой вставки(), чтобы найти уникальные ключи? Сравнение прост, хотя (целые числа), и весь контейнер, вероятно, может соответствовать кешу
набор
- (PRO): Простой, понятный для этого
- (CON): не постоянное время вставки
- (CON): много распределений/освобождений за кадр
- (CON): Не сопутствующая память. Перемещение множества сотен объектов означает прыжок вокруг много в памяти.
unordered_set
- (PRO): Простой, понятный для этого
- (PRO): Среднее значение времени постоянной времени вставки
- (CON): Видя, как я храню целые числа, операция хэша, вероятно, намного дороже, чем что-либо еще
- (CON): много распределений/освобождений за кадр
- (CON): Не сопутствующая память. Перемещение множества сотен объектов означает прыжок вокруг много в памяти.
Я склоняюсь к тому, чтобы идти по векторному маршруту из-за шаблонов доступа к памяти, хотя набор явно предназначен для этой проблемы. Большая проблема, которая для меня непонятна, заключается в том, является ли перемещение вектора для каждой вставки более дорогостоящим, чем распределения/освобождения (особенно учитывая, как часто это нужно делать) и поиск в памяти набора.
Я знаю, что в конечном счете все сводится к профилированию каждого случая, но если не что иное, как головной убор или теоретически, что, вероятно, было бы лучше всего в этом случае? Есть ли какие-либо плюсы и минусы, которые я, возможно, пропустил?
EDIT: Как я уже не упоминал, контейнер очищается() в конце каждого кадра