У меня есть большая коллекция данных, которые считываются в память — временно, но необходимо для системы.
Я проверял производительность std::vector
, а также std::unordered_map
.
Для std::vector
я использовал struct
типа:
struct information{
std::string name;
unsigned int offset;
}
Для std::unordered_map
я использовал std::string
для ключа и unsigned int offset
для значения.
Если, скажем, 2 000 000 из них загружены в память, я попробовал следующее и получил такие результаты:
std::vector:
Для случайной строки, никогда не превышающей 32 символа, если для вектора был вызван резерв.
std::vector<information> vec;
vec.reserve(2500000);
Вставка
vec.push_back({dataName, offset});
довольно быстро. Однако поиск данных происходит очень медленно. Находка была реализована так:
auto it = std::find_if(vec.begin(), vec.end(), [&name](information &info) -> bool {return info.name == name); });
Это имеет смысл, учитывая, что это большой вектор, и правильный struct
найден при сравнении имен. Но это была крайне плохая производительность. Используемая память была в порядке - я предполагаю, что часть роста памяти была связана с изменением размера std::string
.
Мой вопрос о векторной реализации: есть ли способ увеличить время поиска? Я знаю, что вектор можно отсортировать, чтобы увеличить время поиска, но тогда вы потеряете время на сортировку вектора. Особенно на векторе такого размера.
std::unordered_map
:
Вставка
std::unordered_map<std::string, unsigned int> unordMap;
unordMap.reserve(2500000);
unordMap.emplace(name, offset);
занимает очень много времени. При предварительном резервировании места в попытке сократить время вставки происходит следующее:
Память в конце вставки намного больше, если не вызывать резерв, без резерва память все равно намного больше, чем при векторной реализации. Резерв на самом деле не улучшает время вставки.
Конечно, поиск очень быстрый. Мой вопрос о std::unordered_map
: можно ли улучшить время вставки и использование памяти?
Если ни то, ни другое невозможно, то мой следующий вопрос, вероятно, будет вполне очевидным. Есть ли способ получить результат между этими двумя структурами данных? Что лучше для больших объемов данных?
push_back()
- person nasser-sh   schedule 28.07.2014unordered_map
, я на всякий случай спрошу: могут ли у вас быть повторяющиеся строки? - person nasser-sh   schedule 28.07.2014