看看下面的数据结构(忽略目的,因为这与迭代部分有关):
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
有人知道为什么以上述方式返回迭代器会花费很多性能吗?