返回std :: vector迭代器-迭代方法的性能差异?

时间:2018-09-13 12:51:29

标签: c++ stl iterator iteration stdvector

看看下面的数据结构(忽略目的,因为这与迭代部分有关):

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/a/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

有人知道为什么以上述方式返回迭代器会花费很多性能吗?

0 个答案:

没有答案