возвращение std :: vector iterator - различия в производительности в итерационных методах? - PullRequest
0 голосов
/ 13 сентября 2018

Взгляните на следующую структуру данных (игнорируйте цель, так как речь идет об итерационной части):

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

У кого-нибудь появилась идея, почему возвращение итератора так, как я это делаю выше, стоит так дорого?

...