Взгляните на следующую структуру данных (игнорируйте цель, так как речь идет об итерационной части):
template<typename T>
struct CacheContainer {
std::unordered_map<shared::object_id_t, T> cache_map;
std::vector<T> cache_vector;
void insert( shared::object_id_t idx, T obj ) {
cache_vector.push_back(obj);
cache_map.insert(std::make_pair(idx, obj));
}
T at(shared::object_id_t idx) {
return cache_map.at(idx);
}
// use vector for iteration
typename std::vector<T>::iterator begin() { return cache_vector.begin(); }
typename std::vector<T>::const_iterator begin() const { cache_vector.cbegin(); }
typename std::vector<T>::iterator end() { return cache_vector.end(); }
typename std::vector<T>::const_iterator cend() const { return cache_vector.cend(); }
};
При итерации с циклом for, основанным на диапазоне, наблюдается значительная потеря производительности при итерации по контейнеру напрямую по сравнению с итерацией по вектору напрямую.
См. Следующий пример:
http://coliru.stacked -crooked.com / а / a77e8ecd863d6fad
Я немного озадачен, откуда разница в производительности между 1) и 2).
Это еще более важно на моей локальной машине:
(MBP i7, Apple LLVM версия 9.1.0 (clang-902.0.39.2))
Accum Time 1.) - 500500 0.000648
Accum Time 2.) - 500500 2e-06
Accum Time 3.) - 500500 1e-06
У кого-нибудь появилась идея, почему возвращение итератора так, как я это делаю выше, стоит так дорого?